Callable如何在引擎盖下工作?可调用对象如何返回值?

时间:2012-08-10 14:10:25

标签: java multithreading

我试图了解Callable在另一个线程上运行时如何返回值。

我正在查看ExecutorsAbstractExecutorServiceThreadPoolExecutorFutureTask等课程,这些课程都在java.util.concurrent包中提供。

通过调用Executors中的方法(例如newSingleThreadExecutor())来创建ExecutorService对象。然后,您可以使用ExecutorService.submit(Callable c)传递Callable对象。

由于call()方法由ExecutorService提供的线程运行,返回的对象在哪里“跳转”回调用线程?

看看这个简单的例子:

1    ExecutorService executor = Executors.newSingleThreadExecutor();
2    public static void main(String[] args) {
3       Integer i = executor.submit(new Callable<Integer>(){
4           public Integer call() throws Exception {
5              return 10;
6           }
7       }).get();
8       System.out.print("Returns: " + i + " Thread: " + Thread.currentThread.getName());
9       // prints "10 main"
10    }

如何将由单独线程运行的call方法中的整数返回到Integer对象(第3行),以便可以通过主线程中的System.out语句进行打印。 (第7行)?

ExecutorService运行其线程之前是否可以运行主线程,以便System.out statement打印为空?

2 个答案:

答案 0 :(得分:8)

  

如何将由单独线程运行的call方法中的整数返回给Integer对象

ExecutorService.submit(...) call()返回对象,但确实返回Future<Integer>,您可以使用Future.get()方法获取该对象宾语。请参阅下面的示例代码。

  

在ExecutorService运行其线程之前是否可以运行主线程,以便System.out语句打印为null?

不,未来的get()方法会等到作业完成。如果call()返回null,则get()将返回(并打印)10保证。

Future<Integer> future = executor.submit(new Callable<Integer>(){
    public Integer call() throws Exception {
       return 10;
    }
});
try {
   // get() waits for the job to finish before returning the value
   // it also might throw an exception if your call() threw
   Integer i = future.get();
   ...
} catch (ExecutionException e) {
   // this cause exception is the one thrown by the call() method
   Exception cause = e.getCause();
   ...
}

答案 1 :(得分:4)

查看ExecutorService.submit()方法:

<T> Future<T> submit(Callable<T> task): 提交值返回任务以执行并返回表示任务的挂起结果的Future。 Future的get方法将在成功完成后返回任务的结果。 如果您想立即阻止等待任务,可以使用result = exec.submit(aCallable).get();

形式的结构


  

Q值。在ExecutorService运行其线程之前是否可以运行主线程,以便System.out语句打印为null?

- &GT; Future<T>.get()等待计算完成所需,然后检索其结果。