Java ExecutorServic线程池异步实现流程

 更新时间:2020年12月01日 11:37:04   作者:手撕高达的村长  
这篇文章主要介绍了Java ExecutorServic线程池异步实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

相信大家都在项目中遇到过这样的情况,前台需要快速的显示,后台还需要做一个很大的逻辑。比如:前台点击数据导入按钮,按钮后的服务端执行逻辑A,和逻辑B(执行大量的表数据之间的copy功能),而这时前台不能一直等着,要返回给前台,告诉正在处理中就行了。这里就需要用到异步了。

点击按钮 -> 逻辑A ->逻辑B(异步) -> 方法结束。

到底,项目需求明确了,就引入了ExecutorServic线程池。

Java通过Executors提供四种线程池,分别为:

  • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author szy 
 * @version 创建时间:2018-5-20 上午10:25:06
 * 
 */
public class Testasync {

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    if(task0() == true){
      System.out.println("执行完毕,看异步结果");
    }
    
  }

  
  public static void task1(){
    System.out.println("task1 is start");
  }
  
  public static void task2(){
     ExecutorService executor = Executors.newFixedThreadPool(1);
     executor.submit(new Callable(){

      @Override
      public Object call() throws Exception {
        // TODO Auto-generated method stub
        
        //增加睡眠时间,便于查看结果
        /* try {
            Thread.sleep(10000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }*/
         
        //异步提交
        int sum = 0;
        for (int i = 0; i < 10000; i++) {
           sum += i;
        }
        System.out.println("task2执行数据的大量导入或者导出");
        System.out.println("task2="+sum);
        System.out.println("task2导入或者导出完成");
        return null;
      }
       
       
     });
    
  }
  
  public static void task3(){
    System.out.println("task3 is start");
    int j = 0;
    while(true) {
      if(j++ > 10) {
        break;
      }
      System.out.println("------------task3 end-----------");
    }
  }
  
  public static boolean task0(){
    task1();
    task2();
    task3();
    return true;
  }
}

然后看结果:

task1 is start
task3 is start
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
task2执行数据的大量导入或者导出
执行完毕,看异步结果
task2=49995000
task2导入或者导出完成

可以看出,task1 和task3先执行了,并且方法在没有等待task2的情况下,直接结束了。

异步的task2另开了一个线程,自己在执行。和主线程已经无关了。

不过,这种在eclipse中以deubug模式是看不出来的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现定时任务的方法详解

    Java实现定时任务的方法详解

    大家都用过闹钟,闹钟可以说是一种定时任务。那么,在 Java 中,如何实现这样的功能呢?即如何实现定时任务呢?本文就来详细和大家聊聊
    2022-10-10
  • SpringMVC @RequestBody Date类型的Json转换方式

    SpringMVC @RequestBody Date类型的Json转换方式

    这篇文章主要介绍了SpringMVC @RequestBody Date类型的Json转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringCloud Webflux过滤器增加header传递方式

    SpringCloud Webflux过滤器增加header传递方式

    这篇文章主要介绍了SpringCloud Webflux过滤器增加header传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Springboot hibernate-validator 6.x快速校验示例代码

    Springboot hibernate-validator 6.x快速校验示例代码

    这篇文章主要介绍了Springboot hibernate-validator 6.x校验,本文以6.2.1.Final版本为例解决了log4j版本的漏洞问题,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • 解决@JsonInclude(JsonInclude.Include.NON_NULL)不起作用问题

    解决@JsonInclude(JsonInclude.Include.NON_NULL)不起作用问题

    这篇文章主要介绍了解决@JsonInclude(JsonInclude.Include.NON_NULL)不起作用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring Cloud分布式定时器之ShedLock的实现

    Spring Cloud分布式定时器之ShedLock的实现

    这篇文章主要介绍了Spring Cloud分布式定时器之ShedLock的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Mybatis游标查询大量数据方式

    Mybatis游标查询大量数据方式

    这篇文章主要介绍了Mybatis游标查询大量数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java父线程(或是主线程)等待所有子线程退出的实例

    Java父线程(或是主线程)等待所有子线程退出的实例

    下面小编就为大家分享一篇Java父线程(或是主线程)等待所有子线程退出的实例,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • java全角与半角标点符号相互转换详解

    java全角与半角标点符号相互转换详解

    这篇文章主要为大家介绍了java全角与半角标点符号相互转换详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 浅析对Spring aware接口理解

    浅析对Spring aware接口理解

    通过aware接口可以获取Spring容器相关信息,但这样会与Spring容器耦合,这篇文章主要介绍了Spring aware接口理解,需要的朋友可以参考下
    2022-08-08

最新评论