在下面的代码中,要求是向某个UI线程发布消息,关于Callable
运行的结果。
Future<T> aFuture = aExecutorService.submit(aCallable); //suppose in thread A
aExecutorService.execute(new Runnable() { //suppose in thread B
@Override
public void run() {
try {
final T aresult = aFuture.get();
sendSuccessMesage(aResult);
}catch( . . . . . . e)
. . . . . . .
sendExceptionHappenedMessage(e.getMessage());
. . . . . . .
}
}
如果线程A被中断,线程B会一直等待结果吗? 这样做的替代/安全方法是什么?
答案 0 :(得分:2)
如果取消了任务aCallable
,则get()可能永远不会返回。最安全,最有效的方法是使用一个任务。
Future future = aExecutorService.submit(new Runnable() {
@Override
public void run() {
try {
final T aresult = aCallable.call();
sendSuccessMesage(aResult);
} catch(Throwable e)
sendExceptionHappenedMessage(e.getMessage());
}
}
});
// to cancel.
future.cancel(true);
取消它的另一种方法是在设置为true时检查AtomicBoolean并检查是否取消。这样,如果需要,仍然可以发送sendCancelledMessage
。
答案 1 :(得分:0)
这取决于您如何处理线程A中的中断。例如:
Future<T> aFuture = null;
try {
aFuture = aExecutorService.submit(aCallable);
Thread.sleep(FOREVER);
} catch (InterruptedException e) {
if (aFuture != null) {
aFuture.cancel(true); //true = interrupts
}
}
在这种情况下,线程B中的aFuture.get()
也会抛出一个InterruptedException,你可以捕获它。