- 三大方法、七大参数、四种拒绝策略
1.三大方法
public static void main(String[] args) {
//单个线程
// ExecutorService threadPool = Executors.newSingleThreadExecutor();
//固定线程
// ExecutorService threadPool = Executors.newFixedThreadPool(5);
//遇强则强
ExecutorService threadPool = Executors.newCachedThreadPool();
try {
for (int i = 0; i < 100; i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok ");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//线程池,用完得关闭
threadPool.shutdown();
}
}
2.七大参数、四种拒绝策略
/*
* 三大方法、七大参数、四大拒绝策略
* new ThreadPoolExecutor.AbortPolicy() //超过最大承载数,抛出异常
* new ThreadPoolExecutor.DiscardPolicy() //超过最大承载数,不执行,不抛异常
* new ThreadPoolExecutor.CallerRunsPolicy() //超过最大承载数,哪来的回哪去,交给来的时候线程执行
* new ThreadPoolExecutor.DiscardOldestPolicy() //超过最大承载数,与最初执行的线程竞争,成功则执行
* */
public class Demo2 {
public static void main(String[] args) {
//推荐这种方式创建线程池
//最大承载数:max+capacity
//池的最大线程数如何定义(调优):
//1.CPU 密集型:CPU几核,就定义几,效率最高
// -获取CPU核数 Runtime.getRuntime().availableProcessors()
//2.IO 密集型 获取程序中耗IO的线程数,设置的线程数大于它,避免阻塞,一般两倍即可
ExecutorService threadPool = new ThreadPoolExecutor(
2, //核心线程池数量
5,//线程最多的数量
3,//超时时间
TimeUnit.SECONDS,//单位
new LinkedBlockingQueue(3),//阻塞等待的数量,超过等待的最大数量,启用备用线程池
Executors.defaultThreadFactory(),//默认创建线程工厂
new ThreadPoolExecutor.DiscardOldestPolicy() //超过最大承载数,与最初执行的线程竞争,成功则执行
);
try {
for (int i = 1; i <= 9; i++) {
int finalI = i;
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" Ok "+ finalI);
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//线程池,用完得关闭
threadPool.shutdown();
}
}
}