2010-11-23 6 views
12

マルチスレッドのJavaプログラムでは、スレッドオブジェクトTがインスタンス化され、スレッドが開始される前にT.join()が呼び出された場合はどうなりますか?別のスレッドがT.join()を呼び出す前後にTがインスタンス化された後、いつでもT.start()を呼び出すことができると仮定します。ターゲットがまだ起動していない場合のJavaでのThread.join()の動作は何ですか?

T.join()がT.start()より前に呼び出され、T.join()を呼び出すスレッドがハングするという問題があると思うからです。

はい、私はいくつかの設計上の問題があると知っていますが、これを修正すれば、これは問題にならない可能性があります。しかし、Java APIのドキュメントでは「このスレッドが終了するのを待つ」という唯一のことがあるので、join()動作の詳細を知りたいと思います。

+1

お試しください。別の簡単なプロジェクトを作り、何が起こるかを見てください。 – BeemerGuy

+3

BeemerGuy:たぶん、ある時点で、しかし、私は試行錯誤だけで舞台裏で起こっていることを完全に照らすとは確信していません。他の誰かがすでに知っている可能性があり、時間を節約することができます。 – DGH

答えて

11

それは戻ってきます。以下のコードを参照してください。スレッドが開始する前にisAlive()がfalseになるので、何も起こりません。

public final synchronized void join(long millis) 
    throws InterruptedException { 
    long base = System.currentTimeMillis(); 
    long now = 0; 

    if (millis < 0) { 
      throw new IllegalArgumentException("timeout value is negative"); 
    } 

    if (millis == 0) { 
     while (isAlive()) { 
     wait(0); 
     } 
    } else { 
     while (isAlive()) { 
     long delay = millis - now; 
     if (delay <= 0) { 
      break; 
     } 
     wait(delay); 
     now = System.currentTimeMillis() - base; 
     } 
    } 
    } 

コードスニペットは©著作権オラクル2006および/またはその関連会社である、とfound hereをすることができます。ライセンスはです。

+0

ここに貼り付けたものは、join(long millis)です。 join()はどうでしょうか?私は行動が両方の方法で同じではないと思います。 – DGH

+0

@DGH:join()はjoin(0)を呼び出します。 –

+0

@Nathan Hughes:それで、説明してくれてありがとう。 – DGH

-1

スレッドが終了するまで無期限に待機する必要があります...あなたのケースでは私が理解する限り起こらないことがあります。

関連する問題