代码举例:
使用ThreadPoolExecutor创建一个忽略最新任务的线程池,创建规则:
1.核心线程数为5
2.最大线程数为10
3.任务队列为100
4.拒绝策略为忽略最新任务
import java.util.concurrent.*;
public class Test {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100), new ThreadPoolExecutor.DiscardPolicy());
for (int i = 0; i < 100; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread().getName());
});
}
}
public static void main1(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(4);
for (int i = 0; i < 1000; ++i) {
service.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
}
}
一.ThreadPoolExecutor:
这个类是Java中创建线程池的原始写法,构造方法中参数比较多,下面一一介绍
1.corePoolSize:最少的线程数.
2.maximumPoolSize:最多的线程数.
3.keepAliveTime:允许新增线程摸鱼的最长时间.
4.TimeUnit:时间单位.
5.workQueue:阻塞队列,有内置的,也可以自己实现.
6.threadFactory:线程工厂.
7.handle:拒绝策略.
二.拒绝策略:
1.AbortPolicy:全部停止,直接抛异常.
2.CallerRunsPolicy:从哪来回哪去,调用者自己处理.
3.DiscardPolicy:丢掉新增的任务.
4.DiscardOldestPolicy:丢掉最早的任务,执行最新的任务.
三.定义最大线程数:
1.CPU密集型:理论上线程数和CPU逻辑核心数相同.
2.io密集型:大部分时间在等待资源,线程数大于CPU逻辑核心数也可以.
总结:由于无法确定线程的工作性质,所以要调试出最理想的线程数.