java – ThreadPoolExecutor:它如何重用线程
我读到ThreadPoolExecutor有线程池,这个池注定要降低创建新线程的成本(至少我以这种方式理解下面的短语):
但是,据我所知,我们无法在Java中重启线程. 问题:ThreadPoolExecutor如何避免创建新线程? 解决方法
它非常简单 – 本质上线程睡眠,等待被任务唤醒 – 它们运行该任务然后再次睡眠.
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会在空的时候阻塞它.当我添加一个项目时,当前被阻止的线程被唤醒,并且将执行任务(LinkedBlockingDeque是线程安全的).线程完成任务后,它会重新进入休眠状态. ThreadPoolExecutor的JavaDoc详细描述了逻辑. ThreadPoolExecutor的所有构造函数都采用BlockingQueue< Runnable> – 这应该给你一个提示,因为逻辑是如何工作的. 注意:这与忙碌的等待不一样. BlockingQueue使用wait和notify来挂起和唤醒线程,这意味着池中的线程在没有处理任务时没有做任何工作.基于繁忙等待的方法不起作用,因为线程将阻止所有CPU核心,其轮询不允许程序继续(或至少严重损害它). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – Hibernate与Oracle jdbc驱动程序的setFirstResult(
- java – 在eclipse调试器中查看全局/静态/继承变量
- java – 在Android应用程序中为HttpClient更改OpenSSL库
- Java的微信开发中使用XML格式和JSON格式数据的示例
- jpa独立定制类型映射/ javax.persistence.x替代org.hiberna
- windbg – !heap -p -a VS!heap -x
- Pyspark:错误 – 在向驱动程序发送端口号之前退出Java网关
- java – 可以为char指定整数值,但不能将整数变量赋给char
- java – 从proguard中排除包
- java中利用Dom4j解析和生成XML文档