Executors--线程池三大方法,七大参数,4大拒绝策略
Executors--线程池三大方法,七大参数,4大拒绝策略
七大参数
ExecutorService threadPool = new ThreadPoolExecutor(
2,//默认核心线程数
5,//最大线程数
3,//实际线程量小于默认+阻塞,多久就恢复释放最大线程到默认线程
TimeUnit.SECONDS,//时间单位
new ArrayBlockingQueue<>(3),//阻塞队列
Executors.defaultThreadFactory(),//默认的线程工厂
new ThreadPoolExecutor.AbortPolicy()//拒绝策略
);
四大拒绝策略
new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去那里
new ThreadPoolExecutor.DiscardPolicy()//队列满了,丢掉任务,不抛异常
new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了,尝试和第一个竞争,不抛异常
如何定义最大线程
1,CPU密集型: 几核就是几,保持CPU效率最高 Runtime.getRuntime().availableProcessors()
2,IO密集型: 大于你程序中十分耗IO的线程、程序。
package ExecutorsA;
import java.util.concurrent.*;
/**
* Executors 工具三大方法
* 七大参数 ExecutorService threadPool = new ThreadPoolExecutor(
* 2,//默认核心线程数
* 5,//最大线程数
* 3,//实际线程量小于默认+阻塞,多久就恢复释放最大线程到默认线程
* TimeUnit.SECONDS,//时间单位
* new ArrayBlockingQueue<>(3),//阻塞队列
* Executors.defaultThreadFactory(),//默认的线程工厂
* new ThreadPoolExecutor.AbortPolicy()//拒绝策略
* );
* 四大拒绝策略 new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,抛出异常
* new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去那里
* new ThreadPoolExecutor.DiscardPolicy()//队列满了,丢掉任务,不抛异常
* new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了,尝试和第一个竞争,不抛异常
* @author liu
*/
public class ThreadPoolA {
public static void main(String[] args) {
//executor三大方法,不常用
//ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程
//ExecutorService threadPool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池
//ExecutorService threadPool = Executors.newCachedThreadPool();//可伸缩的,遇强则强,遇弱则弱
//自定义线程池,常用
ExecutorService threadPool = new ThreadPoolExecutor(
2,
Runtime.getRuntime().availableProcessors(),
3,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
try {
for (int i = 0; i < 9; i++) {
//使用线程池之后,用线程池来创建线程
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + " OK");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {//线程池用完,程序结束,关闭线程池
threadPool.shutdown();
}
}
}