public class MyThreadPoolDemo {
public static void main(String[] args) {
// System.out.println(Runtime.getRuntime().availableProcessors());
//一池5个线程
// ExecutorService threadPool= Executors.newFixedThreadPool(5);
//一池1线程
// ExecutorService threadPool= Executors.newSingleThreadExecutor();
//一池n线程
// ExecutorService threadPool= Executors.newCachedThreadPool();
//工作中不能使用new Thread创建线程,应该使用自定义线程池,避免了创建线程的开销
//工作中不能使用Excutors中定义好的线程池,因为其中的阻塞队列大小默认为Integer.MAX_VALUE,可能造成cpu无法分配内存,导致oom问题
// 自定义线程池
//最大线程数,也就是第二个参数,要根据主机的处理器数量判断
//获取主机处理器数的方法:System.out.println(Runtime.getRuntime().availableProcessors());
ExecutorService threadPool = new ThreadPoolExecutor(
1, //核心线程数
5,//最大线程数,当核心线程和阻塞队列都满了之后,扩展线程
2,//空闲线程保存时间
TimeUnit.SECONDS,//时间单位
new LinkedBlockingQueue<>(5),//阻塞队列,核心线程满后,将任务放在阻塞队列等待
Executors.defaultThreadFactory(),//默认线程工厂
new ThreadPoolExecutor.DiscardPolicy());//线程池和阻塞队列都满时,要执行的拒绝策略
//submit和execute的区别
//有返回值的线程,用submit
//无返回值的线程,两个都可以用
try {
// for (int i = 0; i < 10; i++) {
// int finalI = i;
// threadPool.execute(() -> {
// System.out.println(Thread.currentThread().getName()+" "+finalI);
// });
// }
for (int i = 0; i < 10; i++) {
int finalI = i;
Future<Integer> future = threadPool.submit(() -> {
System.out.println(Thread.currentThread().getName() + " " + finalI);
return finalI;
});
//会阻塞,直到获得返回值
System.out.println(future.get());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
}