1

有一个通用的任务队列,其中添加了新任务。我想编写代码,通过将它们添加到队列中来创建更多的任务工作。将工作添加到队列的任务将通过轮询队列等待所有任务完成。

使用 Java 实现它的最佳方法是什么。我正在考虑通过实现一个可运行的接口并使其在无限循环中运行并在其间休眠,唤醒以查看是否有任何进展,从而实现了简单线程的一些东西。如果进度正在发生,继续循环,如果它已经完成了跳出循环。有没有其他好的和性能有效的方法来实现这个?

任务如何完成?任务被提交到队列。队列由执行程序轮询并运行任务。

我想做的事?轮询该队列以查看任务是否已完成或仍在执行。

4

3 回答 3

1

您在这里描述的可能是工作队列的粗略草图。您可以将进程排入队列以进行异步处理,等待完成通知,然后终止。这可行,但有新的并发工具可用。我推荐阅读Java 并发课程

新的并发模型允许您通过任务将并发关注点与线程分开,Runnable并且. 与其直接使用线程并构建自己的线程池,不如让线程为您完成繁重的工作。CallableExecutorServiceExecutor

...
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

于 2013-05-01T16:17:56.273 回答
-1

使用java.util.concurrent.Future和一个java.util.concurrent.CompletionService.

于 2013-05-01T14:34:14.643 回答
-1

您可以使用Java 7中的Fork/Join框架

于 2013-05-01T14:34:38.283 回答