我正在寻找一种与Java中的线程进行通信的非常简单的方法。请考虑以下示例:
boolean pass=false;
Thread simpleThread=new Thread(){
public void run(){
x=doStuff();
if (x==0) pass=true;
}
}
simpleThread.start();
我只需要知道doStuff()是否返回零。当然,这在Java中是不合法的,但我该如何正确实现它?看来我需要某种可以由simpleThread编写并由主线程读取的Object。那件丢失的东西是什么?
答案 0 :(得分:8)
您可能想要使用Future<T>
。你可能不是像这样直接开始一个新线程,而是使用ExecutorService
,然后传递Callable<T>
。这将为您返回Future<T>
。
然后你可以随时(从原始线程)询问Future<T>
它是否已经完成,或者直到它已经完成(可选择超时)。 / p>
您可以使用共享变量手动执行等效操作,但我个人认为Future
/ Callable
方法在您有效计算单个(可能是复杂的)值的情况下更清晰一个不同的线程。如果您需要定期与线程进行沟通(例如,为了给它更多的工作,或者看到进展),那么当然不适合。
答案 1 :(得分:4)
使用AtomicBoolean的示例:
final AtomicBoolean pass = new AtomicBoolean(false); //making this final means we can access it in the anonymous Thread instance
Thread simpleThread=new Thread(){
public void run(){
x=doStuff();
if (x==0) pass.set(true);
}
}
simpleThread.start();
...
pass.get(); //of course, this could return false simply because the newly spawned thread has not completed execution yet
答案 2 :(得分:2)
您需要拥有两个线程可以看到的共享对象。该对象必须是可修改的。也就是说,你不能使用原语或基本对象类型,如String,Integer,Boolean等,因为它们是不可变的。
您还需要了解并使用线程同步。
以下是使用列表的示例:
List mylist = new ArrayList();
in-thread
{
synchronized( mylist )
{
mylist.add( _something_ );
}
}
in-another-thread
{
synchronized( mylist )
{
mylist.get( 0 ); // do something with result;
}
}
答案 3 :(得分:0)
说明@ Jon的建议。
ExecutorService executor = ...
Future<Integer> result = executor.submit(new Callable<Integer>() {
public Integer call() {
return doStuff();
}
});
// later.
Integer x = result.get();
boolean pass = x==0;