6

我试图了解 aCallable在不同线程上运行时如何返回值。

我正在查看包中所有可用的 classes Executors、和AbstractExecutorService, 。 ThreadPoolExecutorFutureTaskjava.util.concurrent

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

由于该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打印为空?

4

2 回答 2

8

call方法中的整数怎么可能被单独的线程运行,返回给Integer对象

ExecutorService.submit(...)不返回对象,但它确实返回 a并且您可以使用该方法获取该对象。请参阅下面的示例代码。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();
   ...
}
于 2012-08-10T14:14:17.550 回答
4

看看ExecutorService.submit()方法:

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


问:主线程是否可能在 ExecutorService 运行其线程之前运行,从而 System.out 语句打印 null?

--> Future<T>.get() Waits if necessary for the computation to complete, and then retrieves its result.

于 2012-08-10T14:18:27.330 回答