返回信息流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();
}
}
}
原文称在注释的那一行发生死锁,为什么
这是一条镜像帖。来源:北邮人论坛 / java / #52018同步于 2016/7/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[讨论][问题]java并发死锁的疑问
mengrady1
2016/7/29镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
我感觉书上在这儿并没有说的很清楚,可能少了一句代码,即把RenderPageTask提交给executor:
//在RenderPageTask外面调用
exec.submit(new RenderPageTask()).get();
这样一来,很显然,提交RenderPageTask后子线程内又提交了两个header和footer任务,但是由于ThreadPool是个单线程的,只有当RenderPageTask退出之后才可能执行header和footer任务,而RenderPageTask的退出又依赖于header和footer的完成,循环等待,所以这个线程就被饿死了。
我觉得你说的很对,因为RenderPageTask也是一个Callable肯定是要被执行的,不然的话RenderPageTask实现Callbale没有任何意义。
非常感谢!
【 在 ffantastic 的大作中提到: 】
: 我感觉书上在这儿并没有说的很清楚,可能少了一句代码,即把RenderPageTask提交给executor:
: //在RenderPageTask外面调用
: exec.submit(new RenderPageTask()).get();
: ...................