有一个通用的任务队列,可以添加新任务。我想编写代码,通过将任务添加到队列中来创建更多的任务。将工作添加到队列的任务将通过轮询队列等待完成所有任务。
使用Java实现它的最佳方法是什么。我通过实现一个可运行的接口来思考简单线程的某些内容并使其在无限循环中运行并在两者之间休眠,唤醒以查看是否有任何进展。如果进展正在进行,请继续循环,如果它已完成中断循环。有没有其他好的和性能有效的方法来实现它?
任务如何完成? 任务将提交给队列。队列由执行程序轮询,它运行任务。
我想做什么? 轮询该队列以查看任务是否已完成或仍在执行。
答案 0 :(得分:1)
您在这里描述的内容可能是工作队列的粗略草图。您可以将进程排入异步处理,等待完成通知,然后终止。这有效,但有新的并发工具可用。我建议您阅读Java Concurrency Lesson。
新的并发模型允许您通过任务Runnable
和Callable
以及ExecutorService
将并发问题与线程分开。而不是直接使用线程并构建自己的线程池,而不是让Executor
为您做繁重的工作。
...
ExecutorService ex = Executors.newSingleThreadExecutor();
....
您可以将Runnables和Callables形式的任务交给ExecutorService,并接收可用于监视任务进度的Future对象。
Future<String> f = executor.submit(new Foo());
....
class Foo implements Callable<String> {
@Override
public String call() throws Exception {
return "Bar";
}
}
您可以使用ExecutorCompletionService来监控任务的完成情况:
CompletionService<String> cs = new ExecutorCompletionService<String>(executor);
Future<String> f = cs.submit(new Foo());
... // Let's say you've added TASK_COUNT tasks
for (int i = 0; i < TASK_COUNT ; i++ ) {
try {
String str = cs.take().get();
if (str != null) {
System.out.println(str); //Handle the result of the Callable
continue;
}
} catch (ExecutionException ignore) {}
}
现在您已收到每个callable的结果,您可以使用之前通过Future f
收到的cs.submit(new Foo())
对象,通过调用
f.cancel(true)
每项任务。最后,不要忘记用
清理执行者executor.shutdown();
并发性要比这更多,但我相信上面说明了满足您需求的方法。我建议您也阅读JavaDoc。
答案 1 :(得分:-1)
使用java.util.concurrent.Future
和java.util.concurrent.CompletionService
。
答案 2 :(得分:-1)
您可以使用java 7中的Fork/Join框架