Java 螺纹的可变干涉

Java 螺纹的可变干涉,java,java-me,thread-safety,Java,Java Me,Thread Safety,如何确保initCache方法在t1完成后被强制等待?不要在其他线程中运行它 您可以调用t1.join,但实际上,如果您想先运行任务X,然后再运行任务Y,只需在同一个线程中运行它们…不要在另一个线程中运行它 您可以调用t1.join,但实际上,如果您想运行任务X,然后运行任务Y,只需在同一个线程中运行它们…如果您希望initCache仅在t1完成运行后运行,那么为什么首先要启动t1 只需在run中执行代码,然后在initCache中执行 如果在t1.start和initCache之间发生其他操作

如何确保initCache方法在t1完成后被强制等待?

不要在其他线程中运行它


您可以调用t1.join,但实际上,如果您想先运行任务X,然后再运行任务Y,只需在同一个线程中运行它们…

不要在另一个线程中运行它

您可以调用t1.join,但实际上,如果您想运行任务X,然后运行任务Y,只需在同一个线程中运行它们…

如果您希望initCache仅在t1完成运行后运行,那么为什么首先要启动t1

只需在run中执行代码,然后在initCache中执行

如果在t1.start和initCache之间发生其他操作,那么可以使用t1.join在调用initCache之前等待t1完成。

如果希望initCache仅在t1完成运行后运行,那么为什么首先要启动t1

只需在run中执行代码,然后在initCache中执行

如果在t1.start和initCache之间发生其他操作,那么可以使用t1.join在调用initCache之前等待t1完成

应该这样做。虽然实际上t1.join方法要简单得多

应该这样做。虽然实际上t1.join方法要简单得多。

使用join?认真地90年代的人打电话是因为他们想要回他们的低级同步设备吗

再来点高层次的怎么样?像倒计时

while (t1.isAlive()) {
  try {
    Thread.currentThread().sleep();
  }
  catch (InterruptedException e) {
    //check again
  }
}
initCache();
还可以配置超时等。

使用join?认真地90年代的人打电话是因为他们想要回他们的低级同步设备吗

再来点高层次的怎么样?像倒计时

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

也可以配置超时等。

从我阅读的有效Java和Java并发实践中,我的印象是,除了并发API作者之外,真的没有太多有效的理由再使用join之类的低级东西了。我见过巨大的多线程Java代码库,其中完全没有对join或yeld的调用,我甚至不记得Java还有其他低级功能。如果您只想等待线程完成,那么就不需要在其中引入其他概念。在这种特殊情况下,引入CountDownLatch比仅仅调用join有什么好处?高级抽象在很多情况下都很好——但如果您只是在等待线程完成,我看不出使用join有什么错。并不是说有任何证据表明OP首先需要一个单独的线程……我知道应该如何避免wait和notify/notifyAll,并用更好/更现代的替代方案来取代它们,但我也不认为在这里使用join有什么问题。还有:这就是落选的原因吗?@Joachim:我想是的。在Gugussee发布他的答案4分钟后,我注意到我的答案被否决了。从我对有效Java和Java并发实践的阅读来看,我的印象是,除了并发API作者之外,真的没有太多合理的理由再使用像join这样的低级东西了。我见过巨大的多线程Java代码库,其中完全没有对join或yeld的调用,我甚至不记得Java还有其他低级功能。如果您只想等待线程完成,那么就不需要在其中引入其他概念。在这种特殊情况下,引入CountDownLatch比仅仅调用join有什么好处?高级抽象在很多情况下都很好——但如果您只是在等待线程完成,我看不出使用join有什么错。并不是说有任何证据表明OP首先需要一个单独的线程……我知道应该如何避免wait和notify/notifyAll,并用更好/更现代的替代方案来取代它们,但我也不认为在这里使用join有什么问题。还有:这就是落选的原因吗?@Joachim:我想是的。我注意到,在古古斯贴出自己的答案4分钟后,我的答案遭到了否决。
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();