线程饥饿死锁学习--java并发编程

描述

在线程池中,如果任务依赖于其他任务,那么可能产生死锁。在单线程的Executor中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交任务的结果,那么通常会引发死锁。第二个任务停留在工作队列中,并且等待第一个任务完成,而第一个任务又无法完成,因为它在等待第二个任务的完成。在更大的线程池中,如果所有正在执行任务的线程都由于等待其他其他仍处于工作队列中的任务而阻塞,那么会发生同样的问题。

代码示例

public class ThreadDeadlock {
    ExecutorService exec = Executors.newSingleThreadExecutor();
    
    public class ReaderPageTack implements Callable<String>{

        @Override
        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();
        }
    }
    
}

RenderPageTask向Executor提交了两个任务来获取网页的页眉和页脚,绘制页面,等待获取页眉和页脚任务的结果,然后将页眉、页面主体和页脚组合起来并形成最终的页面,如果使用单线程的Executor,那么ThreadDeadlock会经常发生死锁。

标签: none