2012-03-09 8 views
0

皆を助けてください。私はjavaで同期コードを書いた。 2つのクラスがあります。最初のクラスは1000を増やし、2番目のクラスは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(); 

      } 
     } 
    } 
} 
+0

この宿題はありますか? –

+0

のように見える... –

+0

私はちょうどいくつかのexsercicesに取り組んで...そして私はデッドロックに立ち往生した。 – PKb

答えて

1

あなたがスレッドオーバーライドのrun方法でwaitを呼んでいます。

残念ながら、誰も待機中のオブジェクトに対してnotifyメソッドを呼び出すことはありません。

これはあなたのmain、あなたは再びラップあなたXYThreadにおけるジェネリックThreadオブジェクトにあります。

このため、thread2.notify()への呼び出しは、間違ったオブジェクト(ロックされたYThreadではなくラッパーオブジェクト)に信号を送信します。

変更あなたのプログラムがまだ(あなたが十分な回数notifyingのスレッドではないので)ロックしようとして

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

に宣言が、少なくともそれはさらに得ることができます。最後の文にはmayという通知があります。これは、スレッドが最初にwaitを呼び出す前にthread2へのnotifyが送信される可能性があるためです。

関連する問題