Java内部类实现伪方法级多线程

最近碰到一个问题,就是用户在填写相关信息提交后,后台需要将一些文件同步到另外一台服务器,而这个时候,由于用的是spring的框架,导致前端页面需要等待文件同步完成,才能弹出提示信息。相信大家在很多时候都会碰到这种问题,比如收发邮件,也会等待邮件发送完成,等等。于是便很自然的想到多开一个线程去处理一些比较耗时的任务。但是java本身只提供类级别的多线程,如下:

  1. 继承Thread类

    class A extends Thread {
        public void run() {
            System.out.println("A");
        }
    
        public static void main(String[] args) {
            A a = new A();
            a.run();
        }
    }
  2. 实现Runnable接口
    class B implements Runnable {
        public void run() {
            System.out.println("B");
        }
    
        public static void main(String[] args) {
            B b = new B();
            Thread thread = new Thread(b);
            thread.start();
        }
    }
  3. Executor

    可以更方便的创建管理线程池,后期我会用一篇博客详细讲述。

可以看到,这些多线程的实现方式都是集中在类级别上的,必须要一个类实现或继承相应的接口和类,并且重写run方法,才能启动使用。但是,假设在spring的一个类中:

@RequestMapping("/c")
public class C {
    //主方法
    @RequestMapping("c1")
    public void c1() {
        //需要开启另一个线程调用c2方法,从而不用等待c2执行完毕
        c2();
    }

    //需要实现多线程
    public void c2() {
        //调用c3
        c3();
    }

    //文件同步方法,需要后台执行
    public void c3() {

    }
}

我们要在c2方法中调用后台方法,那么就需要在c1类中调用c2,从而开启另一个线程去执行后台业务代码,而不用等待c3完成

通过上面的几种实现多线程的方式,这个问题是比较难解决的,或者我们新建另一个类去实现多线程:

public class MultiThread implements Runnable {
    //后台业务代码
}

然后在c类中调用MultiThread开启多线程。但是既然我们的标题是使用内部类,那么我们来看看用内部类这个问题就会变得比较简单:

内部类实现伪方法级多线程:

我们还是用上面的例子来说明:

@RequestMapping("/c")
public class C {
    //主方法
    @RequestMapping("c1")
    public void c1() {
        //需要开启另一个线程调用c2方法,从而不用等待c2执行完毕
        //c2();

        (new MultiThreadInnerClass()).start();
    }

    //需要实现多线程
    public void c2() {
        //调用c3
        c3();
    }

    //创建内部类集成Thread,调用c3,开启多线程
    class MultiThreadInnerClass extends Thread{
        public void run {
            c3();
        }
    }

    //文件同步方法,需要后台执行
    public void c3() {

    }
}

这样就可以实现伪方法级的多线程,在日常的编码中,多用内部类会使代码逻辑更清晰,结构更合理。

时间: 2024-08-05 19:09:52

Java内部类实现伪方法级多线程的相关文章

实践JAVA wait(), notify(),sleep方法--一道多线程的面试题

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 这个问题用Object的wait(),notify()就可以很方便的解决. public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private MyThreadPrinter2(String name, O

方法级别的java日志输出控制(二)集群

在方法级别的java日志输出控制(一)这篇文章中主要讨论了通过properties配置文件以及AOP技术批量控制方法级别的日志输出. 用properties配置文件的好处是不用更改程序即可控制日志的输出,然而大型的应用通常是分布式的,会有很多的服务器,需要更改全部服务器上的配置文件,然后再重启应用.这将会是一件非常麻烦的事情.事实上在大型集群应用中有更好的方法实现他.zookeeper的特性决定着它有一个应用场景就是集群配置中心.本文不介绍zookeeper原理以及搭建,将直接使用zookeep

Java内部类引用外部类中的局部变量为何必须是final问题解析

今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该 是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更 广的生命周期,下面通过一个实例加以说明: 如例中所示,在外部类Outer中声明了一个内部类TimerPrint,这个类中的方法引用了方法start中的一个局部变量testTxt 逻辑上:因为该内部类出现在一个方

浅析总结 Java 内部类的一些使用与梳理

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/43282699 --学之开源,用于开源:初学者的心态,与君共勉! ================================

Java 8 中的方法引用

一.原理概要 lambda 表示式,可以作为某些匿名内部类的替代.主要目的是调用该内部类中的方法,而该方法的实现(重写)由 lambda表示式决定. 通常,我们可能不关心匿名内部类中的具体方法(被重写的方法),而只关心该方法是怎么被重写的(方法的实现).因此,我们可以构造一个中间对象(通常是接口,比如 Funtion),该接口拥有一个需要该重写的方法(比如 Function 对应的方法是 apply). 二.如何使用 在实际书写时,可以只写出(传递的参数)与{方法的实现},或者只标出实现过程的

java工程师面试常问的多线程问题【推荐】

思考题:1.说说进程,线程,协程之间的区别 思考题:希望大家积极的思考,并且可以踊跃的说出自己的想法,想法不管对与错,只要说出来就是一种提高,所以,希望小伙伴们可以把自己的想法在留言区给出,这样大家也可以相互学习,有启发的作用,扩展知识面,提高面试能力~ 2.你了解守护线程吗?它和非守护线程有什么区别 程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程.守护线程最典型的例子就是GC线程 3.什么是多线程上下文切换 多线程的上下文切换是指CPU控制权由一个已经正在运行的线程

Java基础学习(四)多线程实战【面试题形式】

1.什么是JUC包 在 Java 5.0 提供了 java.util.concurrent(简称 JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步 IO 和轻量级任务框架. 2.sleep( ) 和 wait( n).wait( ) 的区别 sleep 方法:是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态.当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来.睡眠不释放锁(如果有的话). wai

Java内部类

本文是<Java核心技术 卷1>中第六章接口与内部类中关于内部类的阅读总结. Java中的内部类(inner class)是定义在另一个类内部的类.那么内部类有什么用呢?这里主要由三个内部类存在的原因: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据.即,如果类A中定义了类B,那么类B可以访问类A中的数据,甚至是私有数据,但类A不能访问类B中的私有数据: 内部类可以对同一个包中的其他类隐藏起来.在一个包中,定义一个类时,即使不加上访问权限关键词,这个类也是包内其他类可访问的,不

Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部