基本上,我需要一台具有以下功能的机器:
- 用于运行任务的固定大小的线程池
- 待处理任务队列(已请求,但尚未运行)
- 正在取消待处理队列中的任务(任务由 id 标识)
- 取消正在进行的任务
- 给定任务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/