2017-03-05 90 views
-3

我使用Java 8進行編碼,並通過HTTP請求獲取數據,以便使用JPA進一步處理。我想多線程處理失敗會導致JPA(EclipseLink)需要順序處理。與REST模板的HTTP請求與像content=response.getBody().getDataChunk()檢索單個HTTP請求中檢索需要大約50-70ms,但查詢請求的約1.000s花費很多時間==>使用共享和順序處理的多線程

  1. 啓動HTTP -querying多線程
  2. 保存查詢 - 最有可能在一個堆棧
  3. 從堆棧並對其進行處理

但我不知道如何將詳細信息編碼線索單個數據元素。即,我應該使用什麼樣的對象作爲堆棧?如何啓動正在進行的步驟3的處理? Thread.join()?另外如何限制多個線程的數量2或3? ExecutorService.newCachedPool(3)(或類似的東西?)嗯......

如何正確地做到這一點?這種特定模式的任何鏈接?

+0

歡迎來到Stack Overflow!我們是一個問答網站,而不是一個打碼人員的服務。請解釋你到目前爲止嘗試過的以及爲什麼它沒有奏效。請參閱:[爲什麼「有人可以幫助我?」不是一個實際的問題?](http://meta.stackoverflow.com/q/284236) –

+0

我不是很清楚你的意思與您的帖子。這是一個標準的嗎?或者這已經適用於我的q?如果是這樣,比我好奇你想看到什麼。我只有一個順序代碼,但不知道如何將它們封裝到多線程代碼中。另外我很好奇的設計模式... – LeO

+0

我把這個問題放在你的問題上,因爲我覺得它是相關的。請閱讀鏈接,因爲我認爲它會澄清需要澄清的內容。 –

回答

0

我最近使用類似於下面的代碼來實現這一點。我相信你可以適應它爲你工作。

ExecutorService executor = Executors.newCachedThreadPool() 
List<MyType> results = urls.stream().map((String url)->executor.submit(()-> { 

     return url.substring(2); // retrieve the page and do something with it 

    })) 
    .collect(Collectors.toList()) // this makes sure all urls are submitted before processing the results 
    .stream().map(future -> { 
     try { 
      return future.get(); 
     } catch (InterruptedException | ExecutionException e) { 
      e.printStackTrace(); 
      return "failed"; // or some other value indicating failure 
     } 
    }).collect(Collectors.toList(); 

這可以通過首先創建一個執行器服務來並行運行多個線程。然後它獲取URL列表並將它們中的每一個提交到executor以在頂部lambda中進行處理。

在此之後,它收集所有結果並將它們從Future對象轉換爲底部lambda內的實際值。

+0

據我瞭解,您正在通過'Executor'提交請求 - 全部並行,並且將最後的'.collect(Collectors.toList())'映射到結果中的'future'。這是否意味着我最終可以用一個簡單的'.foreach(...)'迭代結果呢?因爲列表中充滿了'future.get()'但是'.foreach(..)'不會在迭代時遇到像修改那樣的一些Excpetions? – LeO

+0

@LeO我不確定你在問什麼。請注意,我編輯了我的答案 - 查看第一次收集後的評論。這第一次收集給你一個'未來'的'列表'。然後你可以用'.foreach'覆蓋它們,或者使用我的代碼的其餘部分將它們轉換成實際結果值的'List'。 – Nulano