2016-03-23 14 views
0

私はそれがインタビューだ:Javaのマルチスレッド - 自然な順序で番号を印刷する方法

Thread-A Prints Even numbers from 0 
Thread-B prints Odd numbers from 1 

私はachiveするにはどうすればよい千 まで自然な順序で.... 0 1 2 3 4を印刷したいです。あなたがスレッドを起動すると、その時点で、= ThreadDemo2.aa

public class ThreadDemo2 { 
    static int aa = 0; 

    public static void main(String[] args) { 
     boolean mytime = true; 
     EvenThread et = new EvenThread(mytime); 
     OddThread ot = new OddThread(mytime); 
     et.start(); 
     ot.start(); 

    } 

} 

class EvenThread extends Thread { 
    boolean mytime; 
    int i = 0; 

    public EvenThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 0) { 
      for (int i = 0; i < 1000 && ThreadDemo2.aa == 0; i += 2) { 
       System.out.println(i); 
       ThreadDemo2.aa = 1; 
       try { 
        sleep(500); 

       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     // } 

     }/* else 
      try { 
       this.wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
    } 

} 

class OddThread extends Thread { 
    boolean mytime; 
    int i = 1; 

    public OddThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 1) { 
      for (int i = 1; i < 1000 && ThreadDemo2.aa == 1; i += 2) { 
       System.out.println(i); 
       ThreadDemo2.aa = 0; 
       try { 
        sleep(500); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      //ThreadDemo2.aa = 0; 
     //} 
    } 

} 
+0

他の人があなたのコードをコピーしてコンパイルして実行するとは思わないでください。何が起こるか教えてくれれば簡単です。さらに、私が言うことができる限り、あなたのコードには、ここで必要な本質的なものが欠けています.2つのスレッドをインターロックする必要があります。基本的に正しい順序で番号を印刷するにはロックステップで実行する必要があります。それは割り当てのハード**部分のようなものです。だから、あなたは私たちがあなたのために重労働をして欲しいのですか? – GhostCat

+0

@Jägermeister、それは私たちが普通に人々に伝えるものの反対です。あなたはOPに "何が起こるか教えてください"と言いますが、OPは何が起こったのかを理解していません。だから彼は尋ねている。実際にコードがコード自体よりも良い記述はありません。あなたのコードを見せてくれるSOのコメントを数えてみてください。 OTOHでは、あまりにも多くのコードを投稿することがあり、簡略化するように要請しています(http://sscce.org/を参照)。 –

+0

次のリンクを参照してください:http://stackoverflow.com/a/36183057/437506 –

答えて

0

残念ながら、あなたは何回もこのアプリケーションを実行すると

public class Test12 { 

public static void main(String[] args) { 
    Thread1 t1=new Thread1(); 
    Thread2 t2=new Thread2(); 


} 

} 

class Thread1 implements Runnable { 

public Thread1() { 
    Thread t = new Thread(); 
    t.start(); 
} 

@Override 
public void run() { 
    try { 
     for (int i = 0; i < 1000; i++) { 
      if (i % 2 == 0) { 
       System.out.println(i); 
      } 

     } 

    } catch (Exception e) { 

    } 
} 
} 

class Thread2 implements Runnable { 

public Thread2() { 
    Thread t = new Thread(this); 
    t.start(); 

} 

@Override 
public void run() { 
    try { 
     for (int i = 0; i < 1000; i++) { 
      if (i % 2 == 1) { 
       System.out.println(i); 
      } 

     } 

    } catch (Exception e) { 

    } 
} 

} 

、あなたはそこにあることに気づくでしょう、あなたは、2つの異なるスレッドに取り組んでいるため、JVMの結果を期待することはできませんが、そのような何かを行うことができます他のような結果はありません。

+0

ありがとう、それは働く、私はコードを理解することができます。しかし、それは私が1000から10を変更する場合は動作しません。 – Sun

+0

私はあなたが結果を期待することはできないので、他の100%それはOSやあなたのJVMに依存しているような結果がない –

0

私はこの方法を試してみました。

forのループはOddThreadに決して開始しません。したがって、プログラムは進まない。

代わり:

  • は、両方のループのための条件&& ThreadDemo2.aa == 0//or 1を除去します。
  • 時間遅延を削除します。
  • この行を追加する:while(ThreadDemo2.aa == 0){}// or 1それぞれのループ。

この行は、値まで正しいこと、そして唯一のループが前方に移動し、ループ待機のために作るだろう。これはあなたの問題を解決するはずです。

+0

変数aaもvolatile宣言されなければならないか、別のスレッドは変更を見ることができません。 –

+0

@ Leto、あなたは正しいかもしれませんが、私はこれらの変更で試してみました。 – Hackerdarshi

0

この方法では、タスクを実行できます。モニターを使用すると、正しい出力を確保するために余分なループを追加する必要はありません。

public class ThreadDemo2 { 
    static int aa = 0; 
    static Object lock = new Object(); 

    public static void toggleThread(int threadaa) throws Exception 
    { 
    synchronized(lock) 
    { 
     if(aa == threadaa) 
     { 
      aa = (threadaa - 1) * -1; 
      lock.notifyAll(); 
      lock.wait(); 
     } 
     else 
     { 
      lock.wait(); 
     } 
    } 
    } 

    public static void releaseThreads() 
    { 
    try 
    { 
      synchronized(lock) 
     { 
      lock.notifyAll(); 
     } 
    } 
    catch(Exception e) 
    { 
    } 
    } 

    public static void main(String[] args) { 
     boolean mytime = true; 
     EvenThread et = new EvenThread(mytime); 
     OddThread ot = new OddThread(mytime); 
     et.start(); 
     ot.start(); 

    } 

} 

class EvenThread extends Thread { 
    boolean mytime; 
    int i = 0; 

    public EvenThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 0) { 
      for (int i = 0; i < 10; i += 2) {  
       try { 
        ThreadDemo2.toggleThread(0); 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     System.out.println(i); 
     // } 

     }/* else 
      try { 
       this.wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
    ThreadDemo2.releaseThreads(); 
    } 

} 

class OddThread extends Thread { 
    boolean mytime; 
    int i = 1; 

    public OddThread(boolean mytime) { 
     this.mytime = mytime; 
    } 

    public void run() { 
     //if (ThreadDemo2.aa == 1) { 
      for (int i = 1; i < 10; i += 2) { 


       try { 
        ThreadDemo2.toggleThread(1); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     System.out.println(i); 
      } 
      //ThreadDemo2.aa = 0; 
     //} 
    ThreadDemo2.releaseThreads(); 
    } 

} 
0

おそらく、あなたの練習の範囲はスレッドロックを使用することでした。以下の例では、2つのMonitor Objectロックを使用しています。各スレッドは、基本的には、前方に進む前に他のスレッドが繰り返しを完了するのを待ちます。

public class ThreadInterleave { 

    public static class Even implements Runnable{ 
     private Object even; 
     private Object odd; 
     private int count = 0; 

     public Even(Object even,Object odd){ 
      this.even = even; 
      this.odd = odd; 
     } 

     public void run(){ 
      while(count<1000) { 
        System.out.println(count); 
        count+=2; 
       synchronized (odd){ 
        odd.notify(); 
       } 

       synchronized (even){ 
        try { 
         even.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 



      } 
     } 
    } 

    public static class Odd implements Runnable{ 
     private Object even; 
     private Object odd; 
     private int count = 1; 

     public Odd(Object even,Object odd){ 
      this.even = even; 
      this.odd = odd; 
     } 

     public void run(){ 
      while(count<1000) { 
       System.out.println(count); 
       count+=2; 
       synchronized (even){ 
        even.notify(); 
       } 

       synchronized (odd){ 
        try { 
         odd.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 



      } 
     } 
    } 

public static void main(String[] args){ 
     final Object even = new Object(); 
     final Object odd = new Object(); 
     Thread tEven = new Thread(new Even(even,odd)); 
     Thread tOdd = new Thread(new Odd(even,odd)); 


     tEven.start(); 
     tOdd.start(); 



    } 
} 
関連する問題