基本上,我需要一个机器来完成以下工作:
有谁能提出最好的方法来达到这个目标,特别是第3-5项。我非常感谢一些代码示例。
谢谢。
发布于 2013-12-09 08:35:01
除了任务状态和取消之外,其他一切都是线程池的标准。取消和状态状态可以通过以下方式完成:
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)来取消任务。
发布于 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/
https://stackoverflow.com/questions/20465631
复制相似问题