Java中的并行处理 - 将任务调度到线程

时间:2013-11-14 14:36:59

标签: java multithreading parallel-processing threadpool blockingqueue

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

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

例如:

  1. 当第一个对象从队列中取出时,他将由Thread1处理。
  2. 如果第二个对象的ID不同于第一个,则它将由Thread2处理。
  3. 如果第三个对象的ID与第一个对象的ID相同,则它将“转到Thread1”。
  4. 我该如何实现?

    由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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关联为值。并且您使用getQueueIfObjectIdPreviouslyUsed方法执行必要的工作。