多线程和死锁

时间:2009-07-07 10:54:22

标签: java multithreading

建议我任何实时情况,我应该创建多个线程,然后引入死锁情况。这是一个项目!你可以帮助在一些实时情况下使应用程序更有趣吗

4 个答案:

答案 0 :(得分:5)

认识哲学家,金叉和一大碗意大利面

答案 1 :(得分:2)

这会导致死锁:

public static void main(String[] args) 
{
  final Object object1 = new Object();
  final Object object2 = new Object();

  Thread thread1 = new Thread(
    new Runnable() 
    {
      public void run() 
      {    
        try 
        {    
          //**** Lock on object1 first ****
          synchronized(object1) 
          {    
            Thread.sleep(1000);

            //**** Lock on object2 second ****
            synchronized(object2) 
            {
              System.out.println("Should never get here.");
            }
          }
        }
        catch (InterruptedException e) 
        {    
          System.out.println("Thread interupted.");
        }
      }
    }
  );

  Thread thread2 = new Thread(
    new Runnable() 
    {
      public void run() 
      {
        try 
        {
          //**** Lock on object2 first ****
          synchronized(object2) 
          {    
            Thread.sleep(1000);

            //**** Lock on object1 second ****
            synchronized(object1) 
            {
              System.out.println("Should never get here.");
            }
          }
        }
        catch (InterruptedException e) 
        {
          System.out.println("Thread interupted.");
        }
      }
    }
  );

  thread1.start();
  thread2.start();
}

基本上你有2个线程在同一个对象上竞争锁。线程1在object1上获得锁定,而线程2在object2上获得锁定,然后每个线程都试图锁定另一个对象,并且因为另一个线程已经拥有锁定而导致死锁。

答案 2 :(得分:0)

您可以使用producer-consumer算法来演示多线程。

报告生成器 方案是,每个报告的数据被插入队列中以供一个服务(生产者)进一步处理。报表处理器服务(使用者)从队列中获取报告的数据,并一次处理一个报告。报告处理器服务可以有5种不同的实例。所有这些都使用单个队列中的报告(这可能是您需要在队列中引入锁定等)。

答案 3 :(得分:0)

您还可以使用固定大小的线程池进行死锁:

final ExecutorService exec = Executors.newFixedThreadPool(1);
exec.submit(new Runnable() {
    public void run() {
        Future<?> f = exec.submit(new Runnable() {
            public void run() {
            }
        });
        try { f.get(); } catch (Exception ex) { }
    }
});