与Java线程的简单通信

时间:2011-01-13 20:10:07

标签: java multithreading

我正在寻找一种与Java中的线程进行通信的非常简单的方法。请考虑以下示例:


boolean pass=false;
Thread simpleThread=new Thread(){
  public void run(){
    x=doStuff();
    if (x==0) pass=true;
  }
}
simpleThread.start();

我只需要知道doStuff()是否返回零。当然,这在Java中是不合法的,但我该如何正确实现它?看来我需要某种可以由simpleThread编写并由主线程读取的Object。那件丢失的东西是什么?

4 个答案:

答案 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;