我有一个使用Java制作的项目。
我有一个复杂的处理,类似于从一个单独的进程创建10个不同的线程,然后该进程等待其他线程完成处理。现在,创建的线程执行一些数据库处理,然后最终生成输出。但这里的问题是,一直在等待的进程,再次需要处理在创建的线程中创建的所有数据,以及聚合结果的排序。
我几乎无能为力。
此致
答案 0 :(得分:3)
您可以使用java.util.concurrent.ConcurrentLinkedQueue。让每个线程在完成后将结果放在队列中。主线程只是监视队列并在结果进入时处理结果。
另一种选择是使用期货。而不是线程只是为每个进程使用Futures。主线程将在等待每个未来完成它的处理时阻塞。
答案 1 :(得分:1)
您可以考虑使用BlockingQueue在一个数据结构中聚合所有数据。
然后,您的主进程可以使用此队列(甚至在所有线程实际完成其工作之前)。
答案 2 :(得分:0)
您需要在主线程中启动10个线程,并等待它们完成。这可以在10个已启动的线程中的每一个上调用Thread.join()
(在它们全部启动之后)。
有关线程的更多信息,请阅读the Java tutorial about concurrency。
答案 3 :(得分:0)
如果您的困难是如何在主线程中等待子线程完成其工作,那么您可以在主线程的子线程上使用childThread.join()
。如果您对如何将子线程从db availble带到主线程进行处理所带来的结果感到困扰,那么使用一些由子线程填充的共享数据结构,然后由主线程访问。 (确保正确同步)
但是,对于所有此类任务,最好在Java 1.6中使用Executor
框架。
答案 4 :(得分:0)
您可以使用共享对象向其添加数据。
如果我理解的话:
创建一个将最终保存所有数据的类(例如MyData)。这个类可以有“getData”方法返回数据,“add”方法可以将数据添加到你选择的某个集合中(数组,列表,......)。
然后当线程完成处理它调用的数据时:
MyData.add(partialDataFromThread)
最后你的主要课程将会:
MainClass.process(MyData.getDatA());
希望它有所帮助...
答案 5 :(得分:0)
您可以使用java.util.concurrent.CompletionService提交和轮询任务完成。
或者查看CountdownLatch或CyclicBarrier类。
如果您需要示例,请告诉我,因为我认为互联网已经充满了这样的例子; javadocs也非常好,而且一手掌握它总是一个很好的学习曲线。