您在这里描述的可能是工作队列的粗略草图。您可以将进程排入队列以进行异步处理,等待完成通知,然后终止。这可行,但有新的并发工具可用。我推荐阅读Java 并发课程。
新的并发模型允许您通过任务将并发关注点与线程分开,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) {}
}
Future f
现在您已经收到了每个可调用的结果,您可以使用之前收到的对象清理您的任务cs.submit(new Foo())
,通过调用
f.cancel(true)
在每个任务上。最后,别忘了用
executor.shutdown();
并发性远不止于此,但我相信以上说明了满足您需求的一种方法。我也建议阅读JavaDoc。