1、需要引入jar

<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>20.0</version>
</dependency>

2、线程池正确方式如下

// 导入类如下
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.google.common.util.concurrent.ThreadFactoryBuilder;



    // 定义线程池
    private static ExecutorService executorService  = new ThreadPoolExecutor(
        Runtime.getRuntime().availableProcessors(), // 线程池中核心线程数的最大值
        Runtime.getRuntime().availableProcessors() * 2, // 线程池中能拥有最多线程数
        60, // 线程闲置保活时间
            TimeUnit.SECONDS, // 保活时间单位 ,秒
        new LinkedBlockingQueue<>(1000), // 用于缓存任务的阻塞队列
        new ThreadFactoryBuilder().setDaemon(true).setNameFormat("bridge-downlink-handle-%d").build(), // 线程初始化工厂
//     表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池 对待 添加新任务时采取的策略
        new ThreadPoolExecutor.CallerRunsPolicy()
    );

3、当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池 对待 添加新任务时采取的策略

* 1、ThreadPoolExecutor.AbortPolicy() 抛出RejectedExecutionException异常
* 2、ThreadPoolExecutor.CallerRunsPolicy() 由向线程池提交任务的线程来执行该任务
* 3、ThreadPoolExecutor.DiscardOldestPolicy() 抛弃最旧的任务(最先提交而没有得到执行的任务)
* 4、ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务

4、队列的类型

(1)SynchronousQueue<Runnable>:此队列中不缓存任何一个任务。向线程池提交任务时,如果没有空闲线程来运行任务,则入列操作会阻塞。当有线程来获取任务时,出列操作会唤醒执行入列操作的线程。从这个特性来看,SynchronousQueue是一个无界队列,因此当使用SynchronousQueue作为线程池的阻塞队列时,参数maximumPoolSizes没有任何作用。

(2)LinkedBlockingQueue<Runnable>:顾名思义是用链表实现的队列,可以是有界的,也可以是无界的,但在Executors中默认使用无界的。

 

 

最后修改于 2020-09-09 12:12:31
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇