基本上,我需要一台机器来实现以下目标:
任何人都可以提出实现这一目标的最佳方法,尤其是第3-5项。我真的很感激一些代码示例。
感谢。
答案 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/