gpt4 book ai didi

java - 线程池执行器 : how does it reuse threads

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:56 26 4
gpt4 key购买 nike

我读到 ThreadPoolExecutor 有线程池,这个池注定要降低创建新线程的成本(至少我是这样理解下面的短语):

When you send a task to the executor, it tries to use a pooled thread for the execution of this task, to avoid continious spawning of threads. [Java 7 Concurrency Cookbook]

但是,据我所知,我们无法在 Java 中重新启动线程。

问题:ThreadPoolExecutor 如何避免创建新线程?

最佳答案

这很简单 - 本质上就是 Thread s sleep,等待被任务唤醒 - 他们运行该任务,然后再次休眠。

public static void main(final String[] args) throws Exception {
final BlockingQueue<Runnable> blockingQueue = new LinkedBlockingDeque<>();
final Thread t = new Thread(new Runnable() {

@Override
public void run() {
while (true) {
try {
blockingQueue.take().run();
} catch (InterruptedException ex) {
return;
}
}
}
});
t.start();
blockingQueue.add(new Runnable() {

@Override
public void run() {
System.out.println("Task 1");
}
});
blockingQueue.add(new Runnable() {

@Override
public void run() {
System.out.println("Task 2");
}
});
}

BlockingQueue将阻止 Thread虽然它是空的。当我添加一个项目时,Thread (s) 当前被阻塞的被唤醒,一个人将接受任务(LinkedBlockingDeque 是线程安全的)。当 Thread完成任务后它会回到 sleep 状态。

JavaDoc对于 ThreadPoolExecutor详细描述了逻辑。 ThreadPoolExecutor 的所有构造函数拿个BlockingQueue<Runnable> - 这应该给你一个提示,说明逻辑是如何工作的。

注意:这与忙等待不同BlockingQueue使用 waitnotify暂停和唤醒 Thread s,这意味着 Thread池中的 s 在不处理任务时不做任何工作。基于繁忙等待的方法行不通,因为 Thread s 会阻塞所有 CPU 内核的轮询,不允许程序继续(或至少严重损害它)。

关于java - 线程池执行器 : how does it reuse threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22112469/

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