执行者取消待处理任务 - 需要帮助

时间:2013-12-09 07:51:09

标签: java multithreading executorservice producer-consumer

基本上,我需要一台机器来实现以下目标:

  1. 用于运行任务的固定大小的线程池
  2. 待处理任务的队列(已请求但尚未运行)
  3. 取消待处理队列中的任务(任务由id标识)
  4. 取消正在进行的任务
  5. 给定任务ID,查询任务是挂起还是正在运行
  6. 任何人都可以提出实现这一目标的最佳方法,尤其是第3-5项。我真的很感激一些代码示例。

    感谢。

2 个答案:

答案 0 :(得分:1)

除了任务状态和取消之外的所有内容都是线程池的标准。取消和状态可以通过以下方式完成:

enum TaskState {PENDING, RUNNING};

abstract class MyCallable<V> implements Callable<V>{
    protected volatile TaskState state = PENDING;

    // to make sure state is always set before running the task
    protected abstract V doCall();

    final V call(){
        state = RUNNING;
        return doCall();
    }

    public TaskState getState() { return state; }
}

...

ExecutorService executor = Executors.newFixedThreadPool(4);

Future<V> future = executor.submit(new MyCallable<V>() {
    public V doCall() throws Exception {
        //... some work ...
        if(Thread.interrupted()){
            removeFromMap();
            return null;
        }
    }
});

...

future.cancel(true);

要使任务可取消,需要在执行期间检查Thread.interrupted()状态或其他逻辑布尔标志。获得提交任务的未来之后,应调用future.cancel(true)以通过中断来取消任务。

答案 1 :(得分:0)

您需要的一切都在标签中。如果使用固定线程池ExecutorService,则可以限制可以同时执行的线程数。

如果提交的线程多于可处理的线程数,则它们将保留在队列中。

调用ExecutorService的submit()方法将为您提供一个Future对象,该对象将告诉您该任务是处于挂起状态还是已被取消等等

我有一系列关于ExecutorService的教程:http://codelatte.wordpress.com/2013/11/09/a-simple-newfixedthreadpool-example/

如何使用Future对象:http://codelatte.wordpress.com/2013/11/08/a-simple-cachedthreadpool-example/