1、API介绍
Executors.newFixedThreadPool(10),创建一个固定大小的线程池。
两个构造方法
Executors.newFixedThreadPool(10);
Executors.newFixedThreadPool(10,Executors.defaultThreadFactory());
一个线程数量coreSize
一个线程数量,一个线程factory ThreadFactory
2、线程池逻辑:
1、当线程池的的正在运行线程数量 小于 coreSize 的时候,提交新的任务,会生成新的线程,直到最大值coreSize。
2、如果任务能成功的加入到队列中,需要重新检测,因为可能存活的线程已经结束或者线程池关闭了,这时候拒绝这个任务
注意:只有在提交任务的时候才会创建新的任务。创建了一个10个线程的线程池,提交了3个任务,运行的时候生成了三个线程。
ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.submit(()-> System.out.println("1111111111111111111111")); executorService.submit(()-> System.out.println("222222222222222222")); executorService.submit(()-> System.out.println("3333333333333333333333")); 复制代码
3、题外话:移位操作和位运算
private static final int COUNT_BITS = Integer.SIZE - 3; private static final int CAPACITY = (1 << COUNT_BITS) - 1; private static int workerCountOf(int c) { return c & CAPACITY; } 复制代码
移位操作似乎很多程序不会。
<< 右移操作相当于*2的n次方
& 同为1 取1 其他取0
<< 右移操作,会在左边补全0,例如1 右移2为 变为 100
CAPACITY -1 会将所有的位数变为11,
在& 的时候会屏蔽超过这个CAPACITY -1 的值,相当于取Math.min(CAPACITY -1,c)