在另一个线程中等待Future结果

时间:2012-10-02 08:44:41

标签: java concurrency

在下面的代码中,要求是向某个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会一直等待结果吗? 这样做的替代/安全方法是什么?

2 个答案:

答案 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,你可以捕获它。