2011-03-02 82 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