我试图了解Callable
在另一个线程上运行时如何返回值。
我正在查看Executors
,AbstractExecutorService
,ThreadPoolExecutor
和FutureTask
等课程,这些课程都在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
打印为空?
答案 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)
<T> Future<T> submit(Callable<T> task)
:
提交值返回任务以执行并返回表示任务的挂起结果的Future。 Future的get方法将在成功完成后返回任务的结果。
如果您想立即阻止等待任务,可以使用result = exec.submit(aCallable).get();
Q值。在ExecutorService运行其线程之前是否可以运行主线程,以便System.out语句打印为null?
- &GT; Future<T>.get()等待计算完成所需,然后检索其结果。