Java等待线程问题

时间:2009-07-30 21:37:45

标签: java multithreading

我有一个帖子,我需要等待结果,如下:

t1.start();
while (variableModifiedByMyThread == null) {
    /* do nothing */
}
// "t1" set the value of "variableModifiedByMyThread"

上面的代码正在运行,但不是一个非常好的解决方案...

这段代码是否在做同样的事情(是否在等待“t1”线程)?

t1.start();
try {
    t1.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}
// "t1" thread finished

6 个答案:

答案 0 :(得分:4)

前者正在等待设置变量,后者正在等待线程死亡。如果变量是在线程死亡之前设置的,那么除了:

之外几乎没有什么区别
  • 前者“旋转” - 等待线程一直在做某事(检查变量) - 非常浪费!
  • 后者可以被另一个线程打断。

答案 1 :(得分:4)

考虑Future。这个想法是你有一些计算将在“未来的某个时间”完成,然后你可以检查它是否已经完成,或者等待它。

来自javadoc:

 FutureTask<String> future =
   new FutureTask<String>(new Callable<String>() {
     public String call() {
       return searcher.search(target);
   }});
 executor.execute(future);

答案 2 :(得分:1)

你的第二个代码是什么,观察t1,等待它死掉。一旦t1死亡,它将再次启动。有关该方法,请参阅javadoc

答案 3 :(得分:1)

是的,除非你不是每次机会都通过检查变量来浪费CPU周期。这是一种更好的方法。

这假设仅在t1完成时修改变量。如果t1应该修改变量并保持活跃,那么这将不起作用。

顺便说一句,你不应该简单地旋转这样的循环来等待。你应该至少在循环中调用Thread.yield();否则,在允许任何其他线程运行之前,您可能会多次循环。

编辑:实际上,想到它,一个元素BlockingQueue可能就是你真正想要的。这听起来像是一个生产者 - 消费者问题(特别是如果你不止一次这样做的话),并且BlockingQueue就是为这种事情而构建的。

答案 4 :(得分:0)

public class Test{
  private final Object lock = new Object();
  private Object var = null;

  public void starThreadAndWaitForOutput(){
    Thread t1 = new Thread(new Runnable(){
      public void run(){
        synchronized(lock){
          var=new Object();
          lock.notify();
        }
      }
    }).start();

    synchronized(lock){
      while(var==null)
        lock.wait();
    }

    System.out.println("We have the var and thread 1 is still going!");
  }
}

答案 5 :(得分:0)

只要条件成立,您就可以使用t1.yield()来暂停线程。