首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行器取消挂起的任务-需要帮助

执行器取消挂起的任务-需要帮助
EN

Stack Overflow用户
提问于 2013-12-09 07:51:08
回答 2查看 1.8K关注 0票数 2

基本上,我需要一个机器来完成以下工作:

  1. 固定大小的线程池以运行任务
  2. 挂起的任务队列(请求,但尚未运行)
  3. 取消挂起队列中的任务(任务由id标识)
  4. 取消正在进行的任务
  5. 给定任务id,查询任务是挂起还是正在运行。

有谁能提出最好的方法来达到这个目标,特别是第3-5项。我非常感谢一些代码示例。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-09 08:35:01

除了任务状态和取消之外,其他一切都是线程池的标准。取消和状态状态可以通过以下方式完成:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-12-09 09:01:03

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

如果提交的线程多于所能处理的线程,则将它们保存在队列中。

调用ExecutorService的submit()方法将为您提供一个未来对象,它将让您知道任务是挂起的还是已取消的,等等

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20465631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档