如何在线程run()结束后立即调用方法?

时间:2010-09-30 15:04:46

标签: java concurrency

我想调用一个返回字符串值的方法。实际上,这个字符串值是一个实例变量,run()方法放置了字符串的值。

所以,我想调用一个方法来获取线程run()方法更新的字符串值。

我该怎么做......?

3 个答案:

答案 0 :(得分:9)

查看Callable哪个是可以返回结果的Runnable。

你这样使用它:

您编写Callable而不是Runnable,例如:

public class MyCallable implements Callable<Integer> {
  public Integer call () {
    // do something that takes really long...
    return 1;
  }
}

您可以将其提交给ExecutionService:

ExecutorService es = Executors.newSingleThreadExecutor ();
Future<Integer> task = es.submit(new MyCallable());

您将获得FutureTask句柄,该句柄将在任务完成后保存结果:

Integer result = task.get ();

FutureTask提供了更多方法,例如cancelisDoneisCancelled来取消执行并询问状态。 get方法本身阻塞并等待任务完成。查看javadoc了解详情。

答案 1 :(得分:6)

class Whatever implements Runnable {
    private volatile String string;

    @Override
    public void run() {
        string = "whatever";
    }

    public String getString() {
        return string;
    }

    public void main(String[] args) throws InterruptedException {
        Whatever whatever = new Whatever();
        Thread thread = new Thread(whatever);
        thread.start();
        thread.join();
        String string = whatever.getString();
    }
}

答案 2 :(得分:1)

改为使用Callable<String>,将其提交给ExecutorService,然后在提交时get()上回复Future<String>