4

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

4

2 回答 2

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如果需要,仍然可以发送 a。

于 2012-10-02T08:51:31.430 回答
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
    }
}

在这种情况下,aFuture.get()线程 B 中也会抛出一个 InterruptedException,您可以捕获它。

于 2012-10-02T08:52:11.703 回答