我有一个死锁同步,请帮助启动循环周期

时间:2012-03-09 19:28:56

标签: java loops for-loop synchronization deadlock

大家。我在java中编写了一个同步代码。有2个类,第一个将数字增加1000,第二个增加相同的数字10.该过程应重复100次。 虽然我已经编写了循环周期但它们不起作用。

以下是代码:

public class thread
{
  static int count = 100;
  public static void main(String[] args) 
  {
    Thread thread1 = new Thread(new XThread());
    Thread thread2 = new Thread(new YThread());

    thread1.start();
    thread2.start();
    synchronized(thread2)
      {
        thread2.notify();
      }

  }
}
class XThread extends Thread {
  static long sum=0;

  static int i;
  synchronized public void run() {

    sum=5+1000;
    System.out.println(i+" "+"Thread 1"+" "+sum);

    {
      for(i= 0; i < lab5.count; i++)
        {
          try {
            {
              System.out.println("-----------");                
              this.wait();
            }



          } 
          catch (InterruptedException ex) 
            {
              sum=sum+1000;
              System.out.println(i+" "+"Thread 1"+" "+sum);
              notify();

            }
        }
    }

  }
}

class YThread extends Thread 
{
  static long sum;
  static int i;
  synchronized public void run() 
  {
    sum=5+10;
    System.out.println(YThread.i+" "+"Thread 2"+" "+YThread.sum);
    for(i=0; i < lab5.count; i++)
      {

        try 
          {
            {
              System.out.println("------------");
              this.wait();
            }

          } 

        catch (InterruptedException ex) 
          {
            sum=sum+10;
            System.out.println(YThread.i+" "+"Thread 2"+" "+YThread.sum);
            notify();

          }
      }
  }
}

1 个答案:

答案 0 :(得分:1)

在您的代码中,您在线程覆盖的wait方法中调用了run

不幸的是,没有人在等待的对象上调用notify方法。

这是因为在您的main中,您将XYThread重新包装到通用Thread对象中。

因此,对thread2.notify()的调用将信号发送到错误的对象(不是被锁定的YThread,而是包装器对象)。

将声明更改为

Thread thread1 = new XThread();
Thread thread2 = new YThread();

你的程序仍然会锁定(因为你的notifying线程没有足够多次),但至少它可能会更进一步。在我的最后一句中注意may。这是因为可以在线程调用其第一个notify之前发送wait到thread2。