ThreadPoolExecutor代替new Thread创建异步单线程

Posted ispotu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadPoolExecutor代替new Thread创建异步单线程相关的知识,希望对你有一定的参考价值。

阿里p3c代码规范不允许使用new Thread创建线程,也不推荐使用Executors,推荐使用ThreadPoolExecutor来手动创建线程池。

方式1:corePoolSize设置为0,workQueue使用SynchronousQueue

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(0, 1, 60, 
TimeUnit.SECONDS, new SynchronousQueue<>(), 
new NamedThreadFactory("thread-pool-%d", false), 
new ThreadPoolExecutor.AbortPolicy());
        try 
            threadPoolExecutor.submit(() -> 
                log.info(Thread.currentThread().getName()+"开始异步线程...");
                try 
                    //do something
                 catch (Exception e) 
                    log.error("异步线程...失败", e);
                
            );
         catch (Exception e) 
            threadPoolExecutor.shutdown();
        

方式2:corePoolSize设置为0,但要设置allowCoreThreadTimeOut(默认值为false)为true

threadPoolExecutor.allowCoreThreadTimeOut(true);

workQueue使用SynchronousQueue

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, 
TimeUnit.SECONDS, new SynchronousQueue<>(), 
new NamedThreadFactory("thread-pool-%d", false), 
new ThreadPoolExecutor.AbortPolicy());
        //核心线程超过KeepAliveTime 60s时会关闭核心线程,即线程池销毁
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        try 
            threadPoolExecutor.submit(() -> 
                log.info(Thread.currentThread().getName()+"开始异步。。。");
                try 
                    // do something
                 catch (Exception e) 
                    log.error("异步...失败", e);
                
            );
         catch (Exception e) 
            threadPoolExecutor.shutdown();
        

ThreadPoolExecutor执行顺序:

     线程池按以下行为执行任务

  1. 当线程数小于核心线程数时,创建线程。
  2. 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
  3. 当线程数大于等于核心线程数,且任务队列已满
    1. 若线程数小于最大线程数,创建线程
    2. 若线程数等于最大线程数,抛出异常,拒绝任务

1、当核心线程数为0的时候,会创建一个非核心线程进行执行 

2、keepAliveTime:线程空闲时间

  • 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
  • 如果allowCoreThreadTimeout=true,则会直到线程数量=0

 如果任务执行完毕又没有新的任务到来,corePoolSize=0,线程池里的线程都将消亡,而且没有核心线程阻止线程池关闭,因此线程池也将随之自动关闭。

如果将corePoolSize设置为大于0的数字,再运行以上代码,那么线程池将一直处于等待状态而不能关闭,因为核心线程不受keepAliveTime控制,所以会一直存活,程序也将一直不能结束。

参考:Java 线程池会自动关闭吗|转 - 走看看分享Java 线程池自动关闭机制,推荐在创建任务后手动关闭线程池。http://t.zoukankan.com/east7-p-15679058.html 

以上是关于ThreadPoolExecutor代替new Thread创建异步单线程的主要内容,如果未能解决你的问题,请参考以下文章

ThreadPoolExecutor代替new Thread创建异步单线程

ThreadPoolExecutor代替new Thread创建异步单线程

ThreadPoolExecutor详解

JUC并发编程 共享模式之工具 线程池 JDK 提供的线程池工具类 -- ThreadPoolExecutor(提交任务: submitexecute invokAllinvokeAny)

Java:从源码看ThreadPoolExecutor的执行步骤

Java:从源码看ThreadPoolExecutor的执行步骤