2016-03-21 1 views
-1

に参加:スレッドは、メソッドを使用するにもかかわらず、実行していない私は、このコードのために、この出力を得るなぜ私はかなり理解していない

public class Example { 

    static void threadMessage(String message) { 
     String threadName = 
      Thread.currentThread().getName(); 
     System.out.format("%s: %s%n", threadName, message); 
    } 

    private static class MessageLoop implements Runnable { 
     public void run() { 
      String importantInfo[] = { 
       "Line 1", 
       "Line 2", 
       "Line 3", 
       "Line 4" 
      }; 
      try { 
       for (int i = 0; i< importantInfo.length; i++) { 
        // Pause for 4 seconds 
        Thread.sleep(4000); 
        // Print a message 
        threadMessage(importantInfo[i]); 
       } 
      } catch (InterruptedException e) { 
       ; 
      } 
     } 
    } 

    public static void main(String args[]) throws InterruptedException { 


     threadMessage("Starting MessageLoop thread"); 
     Thread t = new Thread(new MessageLoop()); 
     t.start(); 

     threadMessage("Waiting for MessageLoop thread to finish"); 

     while (t.isAlive()) { 
      threadMessage("Still waiting..."); 
      // Wait maximum of 1 second 
      // for MessageLoop thread 
      // to finish. 
      t.join(1000); 
     } 
     threadMessage("Finally!"); 
    } 
} 

出力:

 
main: Starting MessageLoop thread 
main: Waiting for MessageLoop thread to finish 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 1 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 2 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 3 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 4 
main: Finally! 

を私は内部のこの文を書いた場合ループは、スレッドメインはその実行を続けます。そのスレッドtが終了した後、スレッドmainがその実行を継続すべきではないと想定されていますか?

t.join(1000);

ただし、ブールは実行を続けます。一方、(t.isAliveは()) - - 私の知る限りでは、これらの2行は、メイン スレッドに属しthreadMessage(「まだ待っている...」)

私は、このリンクの例を理解しようとしています:

Java tutorial

ご協力いただきありがとうございます。

+1

?あなたはどんなアウトプットを期待していますか? –

答えて

2

join()メソッドのマニュアルhereをご覧ください。

このスレッドが終了するまでに最大ミリ秒待機します。

あなたはjoin() 1000を渡しているが、それは意味し、メインスレッドに関係なくかどうかthread tの完全である、続行する前に、最大で1秒を待ちます。スレッドtはスリープタイムアウトが4秒であるため、メインスレッドは常にt(結合タイムアウト後)より前に完了します。

メインスレッドが永遠に待機するようにするには、join()(つまり、引数なし)を使用する必要があります。

+0

優秀、それは私にはっきりと分かりました。ありがとう! – William

1
while (t.isAlive()) { 
    threadMessage("Still waiting..."); 
    // Wait maximum of 1 second 
    // for MessageLoop thread 
    // to finish. 
    t.join(1000); 
} 

t.join(1000)待機死ぬスレッドt 1000ミリ秒を意味します。 tは、すべての行を印刷するまでは死ぬことはありません。シナリオは毎秒t.join(1000)タイムアウトであり、tはまだ生存しています(1行を印刷するたびに4秒間スリープするため)。 join(1000) TIMEDOUTとt.isAlive()したがって、あなたのメインスレッドはスレッドtはその仕事を終えた後、t.isAlive()はfalseになります。.. Still waitingをプリントアウトだろうと、それはwhileループは、その後印刷壊し、真であるあなたは、出力には理解していない何Finally

関連する問題