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

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

  • 相关阅读:
    常用函数
    MySQL查询
    mysql的数据类型
    swoole简单demo测试
    linux下搭建lamp环境以及安装swoole扩展
    Linux下NAT模式和桥接模式的网络配置
    PhpStorm+xdebug+postman调试
    windows Apache 环境下配置支持HTTPS的SSL证书
    Yii2 restful api创建,认证授权以及速率控制
    Windows下开启composer镜像服务来安装yii
  • 原文地址:https://www.cnblogs.com/edwinchen/p/4106032.html
Copyright © 2020-2023  润新知