一.参数说明
构建线程池参数
1.corePoolSize 核心线程数量
2.maximumPoolSize 能创建的最大线程数,最大线程数不能大于核心线程数
3.keepAliveTime 也就是当线程空闲时,所允许保存的最大时间,超过这个时间,线程将被释放销毁,但只针对于非核心线程
4.TimeUnit 时间单位,TimeUnit.MICROSECONDS等
5.workQueue 工作队列,这里有几种
5.1 ArrayBlockingQueue 基于数组的有界阻塞队列,必须设置容量,遵循先进先出原则(FIFO)对元素进行排序。
5.2 LinkedBlockingQueue:一个基于链表结构的阻塞队列,可以设置容量,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue
5.3 SynchronousQueue:一个不存储元素的阻塞队列。每个插入offer操作必须等到另一个线程调用移除poll操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue。
5.4 PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
6.threadFactory 线程工厂,用于创建线程
7.handler 当线程边达到最大容量时,用于处理阻塞时的程序策略
7.1 ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
7.2 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
7.3 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
7.4 ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
8.executorService.execute 执行一个实现Runnable 接口的线程
9.executorService.shutdown();停止线程池
代码实例
项目 ThreadFactoryBuilder依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
ThreadTask
package com.thread.demo.test;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;
public class ThreadTask {
public static void testHospTest() {
// 创建一个名为shopTest-pool-%d的线程池
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("shopTest-pool-%d").build();
// 构建线程参数
ExecutorService executorService = new ThreadPoolExecutor(3,
3, 0l,
TimeUnit.MICROSECONDS,
new LinkedBlockingQueue<>(3), threadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
try {
int a = 20;
// 执行线程
executorService.execute(new Seller(a));
} catch (Exception e) {
System.err.println("数值小于0"+e.getMessage());
} finally {
// 停止线程池
executorService.shutdown();
}
}
}
Seller
这个Seller 在execute使用必须实现Runnable接口
package com.thread.demo.test;
public class Seller implements Runnable {
private int ticket;
public Seller(int ticket) {
this.ticket = ticket;
}
@Override
public void run() {
if (ticket > 0) {
while (ticket > 0) {
ticket--;
System.out.println("你已经白嫖了" + ticket + "次");
}
} else {
System.err.println("输入参数有误");
}
}
}
测试
SellerTest
package com.thread.demo.test;
public class SellerTest {
public static void main(String[] args) {
System.out.println("开始白嫖");
ThreadTask.testHospTest();
}
}
测试结果
源码地址
https://gitee.com/FetterXxZzz/thread-factory-test.git