我正在执行一些时间敏感的操作,并且与它们相关联。
此超时机制是使用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;
}
};
答案 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;
}