如何创建 FixedThreadPool
直接 new的话,好像是出不来的
只能通过自动创建来创建一个出来
public class TestFixedThreadPool{
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(5);
}
}
参数传进去 5代表了什么意思?我们进去源码看一下
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
- 第一个参数位置,代表了 corePoolSize,在这也就是核心线程数为 5
- 第二个参数位置,代表了 maximumPoolSize,在这也就是最大线程数为 5
- 第三个参数位置,代表了 KeepAliveTime,在这代表了空闲线程存在的时候为0
- 第四个位置,代表了 unit,也就是毫秒级别的时间,跟 KeepAliveTime对应
- 第五个位置,代表了 workQueue,也就是阻塞队列,在这里的阻塞队列是没有限制存放任务的个数,从源码看,理论能到达 Integer.MAX_VALUE
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
从上面的 corePoolSize 和 maximumPoolSize可以知道,这是一个固定线程数的线程池,也就是线程池会从零开始创建线程直到到达 corePoolSize的个数,之后就算线程池空闲也不会销毁线程,因为不需要销毁线程,所以后面的 KeepAliveTime 设置为 0L
测试运行下 FixedThreadPool
public class TestFixedThreadPool {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(5);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "运行了!!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
for (int i = 0; i < 50; ++i) {
threadPool.submit(thread);
}
threadPool.shutdown();
}
}
创建了一个 corePoolSize为5的线程池,并创建一个线程,run() 方法中实现打印线程的名字还有睡眠500毫秒再运行,下面用了个 for循环提交了50次的任务,最后调用 threadPool.shutdown()关闭了线程池
对于上面打印的内容可以知道,线程池只维持了5个线程,线程执行完任务后,再去取新的任务执行,一直循环
有个问题要给大家知道,如果不关闭线程池行不行?
可以不关闭,但是在测试中,不关闭的话,它执行完所有任务后,就一直会存在在哪里,在真实项目中,是否要关闭,说真的,我是个小白,并不知道
还有就是为啥不调用查看核心线程数,最大线程数,线程存活的时间等等方法?这个是因为,我调用线程池的方法中,并没有存在类似等方法,可能因为这是自动创建的,如果你是用的 ThreadPoolExecutor创建线程池的话,就有方法可以查看
欢迎大家关注下个人的「公众号」:独醉贪欢