线程Thread启动执行完代码之后不就结束了,线程池是怎么复用线程的呢?
我们传入线程池中Runnable或者Callable并不是直接作为参数传入到Thread的构造方法中,而是先缓存到队列中。传入线程池中的Runnable,它的run方法实现大致如下。
1public void run() {
2 try {
3 Runnable task = firstTask;
4 firstTask = null;
5 while (task != null || (task = getTask()) != null) {
6 runTask(task);
7 task = null; // unnecessary but can help GC
8 }
9 } finally {
10 workerDone(this);
11 }
12}
它会循环从缓存队列中去获取我们提交到线程池的Runnable,然在runTask方法调用task.run()
,这样我们提交的Runnable就执行完成了,然后继续用这个线程执行下一个Runnable,这样就达到了线程复用的效果。
内容