我知道java线程无法重启 . 因此,当我向newSingleThreadExecutor提交多个任务时,它如何使用单个线程执行所有任务?
我的理解是newSingleThreadExecutor将一次使用最多一个线程来处理任何提交的任务 . 我猜对于newFixedThreadPool也一样 . 如果无法重新启动线程然后执行n个任务,则应生成n个线程 . 我认为newSingleThreadExecutor,newFixedThreadPool将确保不应该同时生成多个线程,就像我们不使用ExecutorService(我们用线程附加每个任务并单独启动)
这是代码示例
class Task implements Runnable {
public void run() {
System.out.println("ThreadID-" + Thread.currentThread().getId());
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
}
}
}
public class SingleThreadExecutorTest {
public static void main(String[] args) {
System.out.println("ThreadID-" + Thread.currentThread().getId());
ExecutorService ex = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
ex.execute(new Task());
}
}
}
上面的代码总是打印相同的ThreadID .
如果我更换下面的线
Executors.newSingleThreadExecutor();
同
ExecutorService ex = Executors.newFixedThreadPool(2);
然后它再次能够使用2个线程执行所有任务 .
只有我用的时候
Executors.newCachedThreadPool();
我看到不同的线程ID .
ExecutorService如何重用Thread?是不是让它到达死亡状态?
1 回答
ThreadPoolExecutor
维护了一些Worker
个线程,其工作方式如下:当您向具有单个
Worker
线程的ThreadPoolExecutor
提交任务时,调用线程将在以下条件下将任务置于BlockingQueue
中:单
Worker
正忙BlockingQueue
未满当
Worker
空闲时,它将从BlockingQueue
中检索新任务 .