线程饥饿死锁

简介: 线程饥饿死锁

线程饥饿死锁:



     在一个线程池中,如果一个任务依赖于其他任务的执行,就可能产生死锁。对应一个单线程话的Executor,一个任务将另一个任务提交到相同的Executor中,并等待新提交的任务的结果,这总会引发死锁。第二个任务滞留在工作队列中,直到第一个任务完成,但是第一个任务不会完成,因为它在等待第二个任务的完成。


      同样在一个大的线程池中,如果所有线程执行的任务都阻塞在线程池中,等待着仍然处于同一个工作队列中的其他任务,那么会发生同样的问题。这就是线程饥饿死锁。

public class ThreadDeadlock {
   ExecutorService exec = Executors.newSingleThreadScheduledExecutor();
//   ExecutorService exec = Executors.newCachedThreadPool();    //如果添加给线程池中添加足够多的线程,就可以让所有任务都执行,避免饥饿死锁。
  /**
   * 模拟页面加载的例子
   * 
   * 产生死锁分析:
   * RenderPageTask任务中有2个子任务分别是“加载页眉”和“加载页脚”。当提交RenderPageTask任务时,实际上是向线程池中添加了3个任务,
   * 但是由于线程池是单一线程池,同时只会执行一个任务,2个子任务就会在阻塞在线程池中。而RenderPageTask任务由于得不到返回,也会
   * 一直堵塞,不会释放线程资源让子线程执行。这样就导致了线程饥饿死锁。
   * 
   * 在一个Callable任务中,要返回2个子任务
   * @author hadoop
   *
   */
   class RenderPageTask implements Callable<String>{
  @Override
  public String call() throws Exception {
    Future<String>  header,footer;
    header = exec.submit(new Callable<String>(){
    @Override
    public String call() throws Exception {
      System.out.println("加载页眉");
      Thread.sleep(2*1000);
      return "页眉";
    }
    });
    footer = exec.submit(new Callable<String>(){
    @Override
    public String call() throws Exception {
      System.out.println("加载页脚");
      Thread.sleep(3*1000);
      return "页脚";
    }
    });
    System.out.println("渲染页面主体");
    return header.get() + footer.get();
  }
   }
  public static void main(String[] args) throws InterruptedException, ExecutionException {
  ThreadDeadlock td = new ThreadDeadlock();
  Future<String>  futre = td.exec.submit(td.new RenderPageTask());
  String result = futre.get();
  System.out.println("执行结果为:"  +  result);
  }
}
目录
相关文章
|
4月前
|
监控 Linux 编译器
多线程死锁检测的分析与实现(linux c)-有向图的应用
在日常的软件开发中,多线程是不可避免的,使用多线程中的一大问题就是线程对锁的不合理使用造成的死锁,死锁一旦发生,将导致多线程程序响应时间长,吞吐量下降甚至宕机崩溃,那么如何检测出一个多线程程序中是否存在死锁呢?在提出解决方案之前,先对死锁产生的原因以及产生的现象做一个分析。最后在用有向环来检测多线程中是否存在死锁的问题。
57 0
|
4月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
44 1
|
2月前
|
存储 安全 Java
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
71 3
|
3月前
|
存储 监控 程序员
线程死锁检测组件逻辑与源码
线程死锁检测组件逻辑与源码
67 2
|
4月前
|
缓存 算法 Java
多线程04 死锁,线程可见性
多线程04 死锁,线程可见性
22 0
|
4月前
|
算法
出现线程死锁缺陷一般有那些原因?该怎么解决?
出现线程死锁缺陷一般有那些原因?该怎么解决?
30 1
|
4月前
|
Java
Java线程面试题:什么是死锁?如何避免?
Java线程面试题:什么是死锁?如何避免?
38 0
|
5月前
|
Java
Java多线程:什么是死锁(Deadlock)?
Java多线程:什么是死锁(Deadlock)?
61 0
|
5月前
|
Java 程序员 调度
多线程之死锁
多线程之死锁
|
5月前
|
Java
多线程与并发,Java中如何避免死锁?
多线程与并发,Java中如何避免死锁?
61 5