我有一个调用对象,我使用
FutureTask<Integer> task = new FutureTask<Integer>(new MyCallable(name, type));
pool = Executors.newSingleThreadExecutor();
pool.submit(task);
我想知道执行是在pool.submit(task)
后继续还是等待可调用完成其执行?
简而言之,我只想知道是否有任何方法可以像thread.join()
for Callable 一样?
。有没有像 thread.join() 这样的方法可以用于 Callable?
pool.submit(callable)
方法返回一个Future
,如果线程在池中可用,它将立即开始执行。 要执行join
,可以调用与线程连接的future.get()
,返回call()
方法返回的值。 重要的是要注意,如果call()
方法抛出,get()
可能会抛出ExecutionException
。
您无需将Callable
包裹在FutureTask
中。 线程池为您完成此操作。 所以你的代码将是:
pool = Executors.newSingleThreadExecutor();
Future<String> future = pool.submit(new MyCallable(name, type));
// now you can do something in the foreground as your callable runs in the back
// when you are ready to get the background task's result you call get()
// get() waits for the callable to return with the value from call
// it also may throw an exception if the call() method threw
String value = future.get();
当然,如果您的MyCallable
实现了Callable<String>
。 Future<?>
将匹配您的Callable
的任何类型。
task.get()
(任务是FutureTask
)期望当前线程等待线程池程序完成托管任务。
此方法最终返回具体结果或引发作业线程在其任务期间将引发的相同检查异常(尽管包装在 ExecutionException 中)。