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

而不是一个队列和一个线程池,你可以有一个队列为每个单独的线程。当然,你必须自己管理所有这些或使用软件包。