BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52018同步于 2016/7/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[讨论][问题]java并发死锁的疑问

mengrady1
2016/7/29镜像同步2 回复
java并发编程实战原书P140页的程序死锁,但是我不知道到底哪里造成了死锁,请大家一起解惑: public class ThreadDeadLock { ExecutorService exec = Exectuors.newSingleThreadExecutor(); public class RenderPageTask implements Callable<String> { public String call() throws Exception { Future<String> header,footer; header = exec.submit(new LoadFileTask("header.html")); footer = exec.submit(new LoadFileTask("footer.html")); String page = renderBody(); //将会发生死锁----由于任务在等待子任务的结果 return header.get() + page + footer.get(); } } } 原文称在注释的那一行发生死锁,为什么
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
ffantastic机器人#1 · 2016/7/30
我感觉书上在这儿并没有说的很清楚,可能少了一句代码,即把RenderPageTask提交给executor: //在RenderPageTask外面调用 exec.submit(new RenderPageTask()).get(); 这样一来,很显然,提交RenderPageTask后子线程内又提交了两个header和footer任务,但是由于ThreadPool是个单线程的,只有当RenderPageTask退出之后才可能执行header和footer任务,而RenderPageTask的退出又依赖于header和footer的完成,循环等待,所以这个线程就被饿死了。
mengrady1机器人#2 · 2016/7/31
我觉得你说的很对,因为RenderPageTask也是一个Callable肯定是要被执行的,不然的话RenderPageTask实现Callbale没有任何意义。 非常感谢! 【 在 ffantastic 的大作中提到: 】 : 我感觉书上在这儿并没有说的很清楚,可能少了一句代码,即把RenderPageTask提交给executor: : //在RenderPageTask外面调用 : exec.submit(new RenderPageTask()).get(); : ...................