检测超时Callable实例

时间:2015-07-01 14:38:56

标签: java callable

我正在执行一些时间敏感的操作,并且与它们相关联。

此超时机制是使用Java Callable类实现的。

问题是在可调用实例中我使用匿名接口实现(监听器)执行异步任务。

我的问题是当超时触发并且可调用被取消时。异步回调仍然执行并破坏我的程序状态。

如何防止这些回调被触发?我是否只包含一个布尔值,指明是否有超时或是否有另一种实现此目的的方法?

感谢。

代码参考:

Callable<Object> callableTransaction = new Callable<Object>() {

    @Override
    public Object call() throws Exception {

        Callback callback = new Callback() {

            // Do stuff here and change program state.
        };

        performAsyncOperation(callback);

        return ActionProcessor.OPERATION_COMPLETE;
    }
};

3 个答案:

答案 0 :(得分:1)

为什么不删除performAsyncOperation并在调用方法内同步执行操作。

然后,如果您需要任何异步操作,可以使用performAsyncOperation或executor服务调用callableTransaction。

答案 1 :(得分:0)

如果您想要取消内容,请将Callable换入java.util.concurrent.FutureTask ...来电task.cancel(true)。如果您的Callable处于阻塞操作(例如,I / O),则会抛出异常以标记中断。否则,您的线程需要定期使用Thread.isInterrupted()检查它是否应该继续或中止。

是的,这与包含您自己的boolean标志大致相同,但您确实可以获得阻止操作中断的好处。

答案 2 :(得分:0)

您有正确的想法:使用布尔标志来跟踪Callable是否已被中断。 (我假设当您取消Callable时,您指定它应该被中断。)

使用CountDownLatch之类的并发类来使Callable同步运行:

public Object call() throws Exception {

    final AtomicBoolean aborted = new AtomicBoolean();
    final CountDownLatch latch = new CountDownLatch(1);

    Callback callback = new Callback() {

        if (aborted.get()) {
            return;
        }

        // Do stuff here and change program state.

        latch.countDown();  // Tell Callable we're done.
    };

    performAsyncOperation(callback);

    try {
        latch.await();      // Wait for callback to finish.
    } catch (InterruptedException e) {
        aborted.set(true);
    }

    return ActionProcessor.OPERATION_COMPLETE;
}