我实例化了threadPoolExecutor并将异步任务提交到池并获得了Future对象,然后我尝试取消该任务,取消操作无效...
该任务与数据库调用有关。
代码如下,
private ThreadPoolExecutor _scheduledThreadPool;
_scheduledThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(_poolSize, factory);
Future<Object> task = _scheduledThreadPool.submit(task);
tasks.cancel(true);
在上面的代码之后,我观察到_scheduledThreadPool.getQueue()给出了空。
我几天来一直在努力,但没有工作。
请帮我讲解如何在ThreadPoolExecutor中单独取消任务。
感谢
答案 0 :(得分:2)
如果任务在调用cancel()的时候已经运行了 - 这在您的情况下似乎正在发生 - 那么这将不会“神奇地”保证任务将以此方式停止运行你期待的。运行任务的线程将是interrupted,并且您的任务执行的代码必须按照您期望的行为处理此问题。
答案 1 :(得分:0)
您可以尝试:
_scheduledThreadPool.getQueue().clear();
答案 2 :(得分:0)
我们在这里有一个Future
对象:
Future<Object> task = _scheduledThreadPool.submit(task);
ThreadPoolExecutor
使用FutureTask
作为默认的Future
实现。 FutureTask
使用线程中断to cancel the task。因此它在工作线程上调用Thread.intterrupt
。
但是,要使取消发生,任务必须响应中断。换句话说,它必须通过调用Thread.interrupted
/ Thread.currentThread().isInterrupted
来检查当前线程是否被中断。例如,我们正在循环检查中断状态:
final Runnable task = () -> {
while (!Thread.currentThread().isInterrupted()) {
// Do work.
}
}
或者,必须在尊重中断的代码(例如LinkedBlockingQueue.take
)上阻止任务。标准库通常在检测到中断时抛出InterruptedException
。