2011-03-02 85 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()但實際上,如果你想運行任務X,然後任務Y,只是它們運行在同一個線程...

0

如果你想initCache()t1後運行已經完成運行,那麼你爲什麼首先開始t1

只需執行run()然後initCache()中的代碼即可。

如果有一些其他的動作t1.start()initCache()之間發生的事情,那麼你可以使用t1.join()等待t1調用initCache()前完成。

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

這應該這樣做。雖然實際上t1.join()方法是一個更簡單的地獄。

0

使用join()?真的嗎? 90年代是否因爲他們想要他們的低級同步設施而被召喚?

什麼東西有點高級?像CountDownLatch?

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

配置從我*有效的Java *和* Java併發在實踐*我的印象是,除了併發API的作者真的不讀書許多有效的理由使用像* join()*這樣的低級事物。我已經看到了巨大的多線程Java代碼庫,它完全沒有調用* join *或* yeld *以及其他一些我甚至不記得Java仍然存在的低級事物。 – Gugussee 2011-03-02 10:46:38

+1

如果你想要做的只是等待一個線程完成,那麼就沒有必要將*另一個*概念引入它。引入CountDownLatch而不是在這種特殊情況下調用'join' *有什麼好處*?在許多情況下,高級抽象是很好的 - 但如果你只是*等待一個線程完成,我不會看到使用'join'有什麼問題。沒有任何證據表明OP需要一個獨立的線程... – 2011-03-02 10:51:01

+1

我明白'wait()'和'notify()'/'notifyAll()'應該被避免並且被更好/更現代的替代品,但我也沒有看到在這裏使用'join()'的問題。另外:這是降價的原因嗎? – 2011-03-02 10:54:51