2011-03-02 9 views
1
Thread t1= new Thread(new Runnable() { 
      public void run() { 
       //perform Database stuff 
      } 
     }); 
t1.start(); 
initCache();//perform other Database stuff (Can this code be executed while thread 1 is running?) 

t1の終了後にinitCacheメソッドが強制的に待機するようにするにはどうすればよいですか?スレッドによる可変干渉

答えて

5

まずは別のスレッドで実行しないでください。

あなたでしコールt1.join()が、本当に、あなたは唯一のt1を実行するinitCache()をしたい場合は...

0

を、タスクXと、タスクYを実行するだけで同じスレッドでそれらを実行する場合なぜあなたは最初にt1を始めるのですか?

run()でコードを実行し、次にinitCache()でコードを実行してください。

t1.start()initCache()の間で起こっていくつかの他のアクションがある場合、あなたはinitCache()を呼び出す前に終了するt1を待つt1.join()を使用することができます。

-1
while (t1.isAlive()) { 
    try { 
    Thread.currentThread().sleep(); 
    } 
    catch (InterruptedException e) { 
    //check again 
    } 
} 
initCache(); 

これでいいはずです。実際にはt1.join()メソッドはずっと簡単です。

0

使用していますjoin()?真剣に?低レベルの同期化機能を元に戻すために90が呼ばれましたか?

もう少しハイレベルなものはどうですか? CountDownLatchのように?私*効果的なジャワの読書*と*実際にはJavaの並行処理等から

final CountDownLatch cdl = new CountDownLatch(1); 
Thread t1= new Thread(new Runnable() { 
      public void run() { 
       //perform Database stuff 
       cdl.countDown(); 
      } 
     }); 
t1.start(); 
cdl.await(); 
initCache(); 

もタイムアウトを設定することができ

+0

私は並行処理APIの作者のため以外に存在し、実際にはなかったという印象の下にありました* * join()*のような低レベルのものを使用する正当な理由がたくさんあります。私は巨大なマルチスレッドのJavaコードベースを見たことがあります。* join *または* yeld *や、Javaがまだ覚えていない他の低レベルのものについては、まったくゼロコールを呼び出しています。 – Gugussee

+1

スレッドが終了するのを待つだけの場合は、別の*概念を導入する必要はありません。 CountDownLatchを導入するにあたって、この特定のケースで 'join' *を呼び出すだけで*何の利点がありますか?多くの場合、高水準の抽象化が優れていますが、スレッドが終了するのを待っているだけの場合は、 'join'を使って何が間違っているのか分かりません。 OPが別のスレッドを最初に必要とするという証拠はありません... –

+1

私は 'wait()'と 'notify()'/'notifyAll()'が避けられ、より良い/もっとモダンに置き換えられるべき方法を理解しています代わりに、私はここでも 'join()'を使用する際に問題は見られません。また、:これはdownvotesの理由ですか? –

関連する問題