- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我读到 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
使用 wait
和 notify
暂停和唤醒 Thread
s,这意味着 Thread
池中的 s 在不处理任务时不做任何工作。基于繁忙等待的方法行不通,因为 Thread
s 会阻塞所有 CPU 内核的轮询,不允许程序继续(或至少严重损害它)。
关于java - 线程池执行器 : how does it reuse threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22112469/
我是一名优秀的程序员,十分优秀!