死锁和饥饿发生在以下行:
return header.get() + page + footer.get();
怎么样?
如果我们在程序中添加一些额外的代码,它将发生。可能是这样的:
public void startThreadDeadlock() throws Exception { Future <String> wholePage = exec.submit(new RenderPageTask()); System.out.println("Content of whole page is " + wholePage.get()); } public static void main(String[] st)throws Exception { ThreadDeadLock tdl = new ThreadDeadLock(); tdl.startThreadDeadLock(); }导致死锁的步骤:
exec
通过Callable
实现的类将任务提交给渲染页面RenderPageTask
。exec
开始RenderPageTask
在单独的Thread
,唯一的Thread
,将提交执行其他任务exec
顺序。call()
将RenderPageTask
另外两个任务的内部方法提交给exec
。第一是LoadFileTask("header.html"),第二是LoadFileTask("footer.html")。但是由于exec
通过此处Executors.newSingleThreadExecutor();
提到的代码获得的ExecutorService 使用了一个单一的工作线程,该工作线程在一个无限制的queueThread上运行,* 并且该线程已经被分配给RenderPageTask,因此, 它将被排队进入无限制的队列,等待那个线程的执行。 *LoadFileTask("header.html")``LoadFileTask("footer.html")``ThreadRenderPageTask
正在返回一个字符串,其中包含输出LoadFileTask("header.html"),页面主体和输出的串联LoadFileTask("footer.html")。这三个部分page
中的成功通过即可获得RenderPageTask
。但是其他两个部分只能在由分配的单个线程执行两个任务之后获得ExecutorService
。并且Thread仅在call()
return方法之后才可用RenderPageTask
。但是的call
方法RenderPageTask
仅在LoadFileTask("header.html")和LoadFileTask("footer.html")返回之后才返回。因此,不让LoadFileTask
执行就导致 饥饿 。每个等待其他任务完成的任务都会导致 死锁,
我希望这可以弄清楚为什么上面的代码中发生线程饥饿死锁。



