1

我有一个 Callable 我使用

FutureTask<Integer> task = new FutureTask<Integer>(new MyCallable(name, type));
pool = Executors.newSingleThreadExecutor();
pool.submit(task);

我想知道执行是在之后继续pool.submit(task)还是它将等待可调用来完成其执行?

简而言之,我只想知道有没有像thread.join()Callable 这样的方法?

4

2 回答 2

12

...有没有像 thread.join() 这样的 Callable 方法?

如果线程在池中可用,该pool.submit(callable)方法将返回 aFuture并立即开始执行。要执行 a join,您可以调用future.get()which joins 与线程,返回方法返回的值call()。需要注意的是,如果方法抛出,get()可能会抛出一个。ExecutionExceptioncall()

不需要将您的包装CallableFutureTask. 线程池为您做到这一点。所以你的代码是:

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的任何类型。

于 2012-09-27T12:11:26.957 回答
1

task.get()(task being a FutureTask) 期望当前线程等待线程池完成托管任务。

该方法最终返回一个具体结果或抛出与作业线程在其任务期间将抛出的相同检查异常(尽管包装在 ExecutionException 中)。

于 2012-09-27T12:11:41.700 回答