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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

