0

我正在实现一个执行并行处理的 Java 应用程序:当我的应用程序启动时,会创建属于线程池的 4 个线程。然后,我开始接收添加到LinkedBlockingQueue的对象。每个对象都有一个 ID,根据 ID,执行预定义的任务。我的“队列消费者”是那些被初始化的 4 个线程,它们开始将对象从队列中取出,并执行与每个对象对应的任务。

可以定义每个对象将在哪个线程中处理?我想“为每个线程安排任务”。

例如:

  1. 当第一个对象从队列中取出时,他将被 Thread1 处理。
  2. 如果第二个对象的 ID 与第一个不同,它将由 Thread2 处理。
  3. 如果第三个对象与第一个对象具有相同的 ID,它将“转到 Thread1”。

我该如何实施?

谢谢

4

2 回答 2

0

Instead of one queue and a thread pool you could have a queue for each individual thread. Naturally, you would have to manage all this yourself or use a software package.

于 2013-11-14T14:44:13.383 回答
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,您可以使用Map将 objectId 保留为键并关联Queue为值的 a。你在getQueueIfObjectIdPreviouslyUsed方法上做必要的工作。

于 2013-11-14T14:52:17.780 回答