我有一个帖子,我需要等待结果,如下:
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
答案 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()来暂停线程。