2016-03-21 9 views
-1

私は3つのスレッドを持っていますが、プログラムを実行すると結果が得られます。どのようにスレッドを順番に実行できないのか分かりません。私はスレッド1と2と3をそれぞれ実行し続けたいと思います。各スレッドには、複数回印刷するためのループがあります。だから私はメインスレッドを順番に各スレッドを実行するようにしたいと思います。これは私のコードです。スレッドを順番に実行して何度も実行するには?

threadMessage("Starting MessageLoop thread"); 
long patience = 
long startTime = System.currentTimeMillis(); 
Thread t = new Thread(new MessageLoop()); 
Thread t2 = new Thread(new MessageLoop2()); 
Thread t3 = new Thread(new MessageLoop3()); 
t.setPriority(10); 
t2.setPriority(5); 
t3.setPriority(1); 
t.start(); 
t2.start(); 
t3.start(); 

これは私のスレッド関数(3つのスレッド)

private static class MessageLoop 
    implements Runnable { 
    public void run() { 

     try { 
      for(int i = 0;i<20;i++) 
      {  
       Thread.sleep(1000); 
       // Print a message 
       threadMessage("A"); 
      } 

     } catch (InterruptedException e) { 
      threadMessage("thread interrupted"); 
     } 
    } 
} 
private static class MessageLoop2 
implements Runnable { 
public void run() { 

    try { 
     for(int i = 0;i<20;i++) 
     {  Thread.sleep(1000); 
      // Print a message 
      threadMessage("B"); 
     } 

    } catch (InterruptedException e) { 
     threadMessage("thread interrupted"); 
    } 
} 
private static class MessageLoop3 
implements Runnable { 
public void run() { 
    String importantInfo = "E"; 
    try { 
     for(int i = 0;i<20;i++) 
     {  
      Thread.sleep(1000); 
      // Print a message 
      threadMessage(importantInfo); 
     } 

    } catch (InterruptedException e) { 
     threadMessage("Thread interrupted"); 
    } 
} 

であり、これは、それは順番に実行させるために私のコードです。プログラムの実行をMessageLoop1と2と3のように順番に実行したいのですが、

 while (t.isAlive()) { 
     threadMessage("Still waiting..."); 

     t.join(2000); 
     if (((System.currentTimeMillis() - startTime) > patience) 
       && t.isAlive()) { 
       threadMessage("Tired of waiting!"); 
       t.interrupt(); 
           // Shouldn't be long now 
       // -- wait indefinitely 
       t.join(); 

      } 
     while(t2.isAlive()){ 
      threadMessage("Still waiting..."); 
      t2.join(1000); 
      if (((System.currentTimeMillis() - startTime) > patience) 
        && t2.isAlive()) { 
        threadMessage("Tired of waiting!"); 
        t2.interrupt(); 
            // Shouldn't be long now 
        // -- wait indefinitely 
        t2.join(); 

       } 
     } 
      while(t3.isAlive()){ 
       threadMessage("Still waiting..."); 
       t3.join(1000); 
       if (((System.currentTimeMillis() - startTime) > patience) 
         && t3.isAlive()) { 
         threadMessage("Tired of waiting!"); 
         t3.interrupt(); 
             // Shouldn't be long now 
         // -- wait indefinitely 
         t3.join(); 

        } 

      } 
     } 

が、結果はB、A、Cのように来ています。誰もこの状況を説明できますか?私のコードは間違っていますか?ありがとうございました!

+9

注文を管理しません。オペレーティングシステムは動作します。注文が重要な場合は、別のスレッドに入れてはいけません。 – duffymo

答えて

1

スレッドの仕組みです。どのスレッドが最初に終了するかは保証されていません。これは設計によるものです。

私はあなたが望むものを想定しています。実際には、jdkが未来を呼び出すもので、ExecutorServiceです。

(擬似コード - 構文エラーがあります)あなたがそれらを終了するまで、エグゼキュータのサービスを実行するスレッドのカップルを管理しますよう

ExecutorService s = Executors.newCachedThreadPool(); 
try { 
Future f1 = s.submit(new MessageLoop()); 
Future f2 = s.submit(new MessageLoop2()); 
Future f3 = s.submit(new MessageLoop3()); 
f1.await(10, TimeUnit.SECONDS); // waits for the first thread to finish 
// first thread finished now 
f2.await(10, TimeUnit.SECONDS); 
// second thread finished now 
// ... 

} finally { s.shutdown(); } 

非常に重要なのは、ExecutorServiceのの適切なシャットダウンを管理することです。あなたがそれをシャットダウンしなければ、あなたのアプリケーションは終了しません。

0

あなたはあなたが注文を支配していると思いますか?

個別のMessageLoop実装は、決して実行されないようにブロックされていません。だから、彼らはスレッドスケジューリングの尺度で動くだけです。

制御スレッド(順序を強制しようとする)とワーカースレッドの間でロックの役割を果たす共有リソースを導入する必要があります。

現在のコードでは、制御スレッドはワーカーの終了を収集する際に特別なシーケンスを適用するだけです。それは実行され、早期に完了している可能性があります。

逐次実行に興味があり、インライン(コントロールと同じスレッド)を実行したくない場合は、スレッドを順次実行して逐次実行の目標を達成することができます。 (各スレッドを開始し、終了を待ってから別のスレッドを開始する)。

実行順序に制限があるため、実行を調整するためにセマフォーが必要です。

+0

あなたが順番にスレッドを開始した場合、あなたは同じ問題を抱えています;) –

+0

不明なことには申し訳ありません。私は表現することを意味し、t1が終了を待って開始し、t2を開始します。 – rpy