我有一個使用Java製作的項目。多個線程將數據注入到後續進程中
我有一個複雜的處理,就像我從一個單獨的進程創建10個不同的線程,然後進程等待其他線程完成處理。現在創建的線程執行一些數據庫處理,然後最終生成輸出。但問題在於,已經等待的進程需要再次處理創建的線程中創建的所有數據,並對聚合後的結果進行排序。
我幾乎不知道需要做什麼。
問候
我有一個使用Java製作的項目。多個線程將數據注入到後續進程中
我有一個複雜的處理,就像我從一個單獨的進程創建10個不同的線程,然後進程等待其他線程完成處理。現在創建的線程執行一些數據庫處理,然後最終生成輸出。但問題在於,已經等待的進程需要再次處理創建的線程中創建的所有數據,並對聚合後的結果進行排序。
我幾乎不知道需要做什麼。
問候
您可以使用java.util.concurrent.ConcurrentLinkedQueue。讓每個線程在完成後將其結果放在隊列中。主線程只是觀察隊列並在進入時處理結果。
另一種選擇是使用期貨。而不是線程只是使用期貨爲每個進程。主線程會在等待每個將來完成處理時阻塞。
你需要在你的主線程啓動10個線程,並等待它們完成。這可以在10個啓動的線程中的每一個上調用Thread.join()
(在它們全部啓動後)。
有關線程的更多信息,請閱讀the Java tutorial about concurrency。
您可能會考慮使用BlockingQueue來聚合一個數據結構中的所有數據。
然後,您的主進程可以使用此隊列(甚至在所有線程實際完成其工作之前)。
如果您的困難是如何在主線程中等待,直到子線程完成其工作,那麼您可以在主線程的子線程上使用childThread.join()
。如果您對如何將子線程從db提供給主線程進行處理所帶來的結果感到困擾,那麼使用由子線程填充並由主線程訪問的共享數據結構。 (確保你同步正確)
但是,對於所有這些任務,最好在Java 1.6中使用Executor
框架。
您可以使用共享對象向其中添加數據。
如果我理解正確,那麼:
創建一個類,將持有結束時,所有的數據(例如邁德特)。這個類可以有返回數據的「getData」方法和將添加數據到你選擇的某個集合(數組,列表等)的「add」方法。
然後當一個線程與處理數據做了要求:
MyData.add(partialDataFromThread)
而在最後,你的主類就可以了:
MainClass.process(MyData.getDatA());
希望它可以幫助...
您可以使用java.util.concurrent。CompletionService提交併輪詢任務完成。
或者查看CountdownLatch或CyclicBarrier類。
讓我知道你是否需要示例,因爲我認爲互聯網已經充斥着這樣的例子; javadocs也相當不錯,它一直是一個很好的學習曲線。
在這種情況下,主進程將如何知道其他線程已完成工作? –
如果您正在觀看一個隊列,那麼您要麼知道預計會有多少事情,要麼該過程必須在隊列中放置某種標記,表示它已完成。 – mamboking
在期貨的情況下,您只需調用future.get(),並等待線程交付結果。 – mamboking