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() {

    }
}

 

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

posted @ 2014-11-18 18:39  @瞪着太阳的乌鸦  阅读(2166)  评论(5编辑  收藏  举报