java - 执行者取消未决任务 - 需要帮助

标签 java multithreading executorservice producer-consumer

基本上,我需要一台具有以下功能的机器:

  1. 用于运行任务的固定大小的线程池
  2. 待处理任务队列(已请求,但尚未运行)
  3. 正在取消待处理队列中的任务(任务由 id 标识)
  4. 取消正在进行的任务
  5. 给定任务id,查询任务是Pending还是Running

谁能提出实现这一目标的最佳方法,尤其是第 3-5 项。我真的很感激一些代码示例。

谢谢。

最佳答案

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

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() 状态或其他一些逻辑 boolean 标志。获得提交任务的 future 后,应调用 future.cancel(true) 以通过中断任务来取消任务。

关于java - 执行者取消未决任务 - 需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20465631/

相关文章:

multithreading - 如何在 Rust 中为不同线程克隆随机数生成器?

java - java中根据条件动态添加执行器

Java 程序在调度并运行 TimerTask 后永远不会退出

java - 通过正则表达式替换 StringBuilder 中的文本

c++ - 如何知道 std::thread 在 C++ 中何时完成?

java - 程序在多线程中无法顺利结束

java - RxJava 中的单线程 ExecutorService 相当于什么?

java - 从 (ExecutorService) CachedThreadPool 捕获异常

java - 哪个eclipse版本适合客户端服务器Java编程

java - REST API,Angularjs 前端,后端 - Java 与 PHP?