java ExecutorService newSingleThreadExecutor是否仅使用一个线程执行所有任务?
我知道java线程不能重新启动。所以,当我向newSingleThreadExecutor提交多个任务时,它如何使用单个线程执行所有任务 我的理解是newSingleThreadExecutor每次最多使用一个线程来处理任何提交的任务。我猜newFixedThreadPool也是这样。 如果一个线程无法重新启动,那么为了执行n个任务,应该生成n个线程。我认为newSingleThreadExecutor、newFixedThreadPool将确保不会同时生成许多线程,就像我们不使用ExecutorService时所做的那样(我们将每个任务附加一个线程并单独启动) 下面是一个代码示例java ExecutorService newSingleThreadExecutor是否仅使用一个线程执行所有任务?,java,multithreading,Java,Multithreading,我知道java线程不能重新启动。所以,当我向newSingleThreadExecutor提交多个任务时,它如何使用单个线程执行所有任务 我的理解是newSingleThreadExecutor每次最多使用一个线程来处理任何提交的任务。我猜newFixedThreadPool也是这样。 如果一个线程无法重新启动,那么为了执行n个任务,应该生成n个线程。我认为newSingleThreadExecutor、newFixedThreadPool将确保不会同时生成许多线程,就像我们不使用Executo
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());
}
}
}
与
然后,它同样能够使用2个线程执行所有任务
只有当我使用
Executors.newCachedThreadPool();
我看到不同的线程ID
ExecutorService如何重用线程?
它不会让它达到死状态吗?线程池执行器维护一些
工作线程,其工作方式如下:
public class Demo {
public class Worker implements Runnable {
@Override
public void run() {
Runnable task = getTaskFromQueue();
while (task != null) {
task.run();
task = getTaskFromQueue(); // This might get blocked if the queue is empty, so the worker thread will not terminate
}
}
}
public static void main(String[] args) {
Worker worker = new Worker();
Thread thread = new Thread(worker);
thread.start();
}
}
当您将任务提交到具有单个工作线程的ThreadPoolExecutor
时,调用线程将在以下条件下将任务放入阻塞队列
:
- 单个
工作者
正忙
阻塞队列
未满
当工作者
空闲时,它将从此阻塞队列
检索新任务线程池执行器
维护一些工作者
线程,其工作方式如下:
public class Demo {
public class Worker implements Runnable {
@Override
public void run() {
Runnable task = getTaskFromQueue();
while (task != null) {
task.run();
task = getTaskFromQueue(); // This might get blocked if the queue is empty, so the worker thread will not terminate
}
}
}
public static void main(String[] args) {
Worker worker = new Worker();
Thread thread = new Thread(worker);
thread.start();
}
}
当您将任务提交到具有单个工作线程的ThreadPoolExecutor
时,调用线程将在以下条件下将任务放入阻塞队列
:
- 单个
工作者
正忙
阻塞队列
未满
当工作者
空闲时,它将从此阻塞队列
中检索新任务执行器将任务发送到池中,无限循环中的线程检查池中是否有要执行的新任务。因此,newSingleThreadExecutor将有一个线程,其中run方法将运行无限循环。提交的可运行对象将进入队列。无限循环将检查队列,轮询可运行对象并调用其run方法。所以这里Runnable只是用来定义任务。我的缺点是,我认为它将使用Thread(Runnable)构造函数创建一个Thread对象。executor将任务发送到池,无限循环中的线程检查池中是否有要执行的新任务。newSingleThreadExecutor将有一个线程,其中run方法将运行无限循环。提交的可运行对象将进入队列。无限循环将检查队列,轮询可运行对象并调用其run方法。所以这里Runnable只是用来定义任务。我的缺点是,我认为它将使用Thread(Runnable)构造函数创建Thread对象。
public class Demo {
public class Worker implements Runnable {
@Override
public void run() {
Runnable task = getTaskFromQueue();
while (task != null) {
task.run();
task = getTaskFromQueue(); // This might get blocked if the queue is empty, so the worker thread will not terminate
}
}
}
public static void main(String[] args) {
Worker worker = new Worker();
Thread thread = new Thread(worker);
thread.start();
}
}