我们知道,Java创建线程池的方式有四种:
- newFiexedThreadPool(int Threads):创建固定数目线程的线程池。
- newCachedThreadPool():创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
- newSingleThreadExecutor()创建一个单线程化的Executor。
- newScheduledThreadPool(int corePoolSize)创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
其实这四种方式都是在底层调用了ThreadPoolExecutor()方法。
参数含义
- corePoolSize(核心线程数):线程池实际运用线程数。
- maximumPoolSize(最大线程数):线程池最多创建的线程数。
- keepAliveTime:线程存活时间
- unit:线程存活时间的单位(时分秒…)
- workQueue:缓存队列
线程池实现原理
原理图如下:
具体源码如下:
测试实例
友情提示:参考上面的原理图可以更加容易理解偶。
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolTest01 {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,2,0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(3));
}
}
class TaskThread implements Runnable {
private String threadName;
public TaskThread(String threadName) {
this.threadName = threadName;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + this.threadName);
}
}
当向线程池提交三个线程时(小于或等于4个线程):
当向线程池提交5个线程时:
当向线程池提交6个线程时(大于5个线程):