取消threadPoolExecutor中的任务

时间:2014-05-13 07:27:21

标签: java threadpoolexecutor

我实例化了threadPoolExecutor并将异步任务提交到池并获得了Future对象,然后我尝试取消该任务,取消操作无效...

该任务与数据库调用有关。

代码如下,

private ThreadPoolExecutor _scheduledThreadPool;
_scheduledThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(_poolSize,   factory);
Future<Object> task = _scheduledThreadPool.submit(task);
tasks.cancel(true);

在上面的代码之后,我观察到_scheduledThreadPool.getQueue()给出了空。

我几天来一直在努力,但没有工作。

请帮我讲解如何在ThreadPoolExecutor中单独取消任务。

感谢

3 个答案:

答案 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