0

我執行Java應用程序執行並行處理: 當我的應用程序啓動,屬於一個線程池 4個線程創建的。 然後,我開始接收添加到LinkedBlockingQueue的對象。每個對象都有一個ID,並根據該ID執行預定義的任務。我的「隊列使用者」是那些初始化的4個線程,他們開始將對象帶出隊列,並執行與每個對象相對應的任務。並行處理Java中 - 計劃任務線程

可以定義其中Thread將處理每個對象?我想「爲每個線程安排任務」。

例如:

  1. 當第一對象被從隊列中取出,他將通過線程1進行處理。
  2. 如果第二個對象作爲與第一個對象不同的ID,它將由Thread2處理。
  3. 如果第三個對象的ID與第一個對象的ID相同,它將「轉到Thread1」。

我該如何實現?

謝謝

+0

發表當前的代碼 –

+0

我想你可以,但這種排除了有一個隊列和多個線程的目的。我假設有多個線程的意思是通過使用並行處理來提高吞吐量。所以理想情況下,任何空閒線程都會立即啓動新的工作並開始處理。在你描述的場景中,似乎線程可能處於空閒狀態,因爲隊列中的下一個任務'屬於'某個其他正在忙的線程。你確定你不想要4個獨立的隊列嗎? –

回答

0

讓所有線程都有自己的隊列。您可能會執行一個新線程,如MainThreadDispatcherThread,它會從您的LinkedBlockingQueue中獲取對象並決定使用哪一個WorkerThread來處理它。喜歡的東西:

private void decideQueue(String objectId) { // actually decides which thread to process it. 
    Queue queue = getQueueIfObjectIdPreviouslyUsed(objectId); 
    if (queue == null) { 
     queue = getNextAvailableQueue(); 
    } 

    queue.enqueue(); 

    //.. 
    //don't forget to dequeue from the main queue 
    //.. 
} 

以決定是否onjectId預先處理或可能不是你所使用不斷OBJECTID爲重點和值相關聯Queue一個Map。並且你在getQueueIfObjectIdPreviouslyUsed方法中做了必要的工作。

+0

是的,這似乎是一個不錯的選擇! – user2144555

0

而不是一個隊列和一個線程池,你可以有一個隊列爲每個單獨的線程。當然,你必須自己管理所有這些或使用軟件包。