gpt4 book ai didi

java - java ExecutorService newSingleThreadExecutor 是否仅使用一个线程执行所有任务?

转载 作者:行者123 更新时间:2023-12-01 16:34:56 24 4
gpt4 key购买 nike

我知道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如何重用线程?难道不让它达到死亡状态吗?

最佳答案

ThreadPoolExecutor 维护一些 Worker 线程,其工作方式如下:

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();
}

}

当您向具有单个 Worker 线程的 ThreadPoolExecutor 提交任务时,调用线程会将任务放入下面的 BlockingQueue 中条件:

  • 单个Worker很忙
  • BlockingQueue 未满

Worker空闲时,它将从此BlockingQueue检索新任务。

关于java - java ExecutorService newSingleThreadExecutor 是否仅使用一个线程执行所有任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61975778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com