Java点对点线程模型,每个人都在等待Job

时间:2012-09-30 11:07:33

标签: java multithreading runnable blockingqueue

这是一项功课。 我正在尝试创建点对点线程模型:

http://www.informit.com/articles/article.aspx?p=169479&seqNum=5

  

如果委托模型有一个将任务委派给工作线程的boss线程,那么在对等模型中所有线程都具有相同的工作状态。尽管有一个线程最初会创建执行所有任务所需的所有线程,但该线程被视为工作线程并且不进行委派。在这个模型中,没有集中的线程。

所以我的主线程将创建5个线程,它们开始监听我的队列,并且还用主线程创建作业10秒。由于所有线程都必须执行任务,因此该线程还必须等待作业。我怎么能这样做?

BlockingQueue<Job> queue = new ArrayBlockingQueue<Job>(1000);

    Collection<Thread> workers = new ArrayList<Thread>();
    for(int i = 0; i < 5; i++) {
        Thread thread = new Thread(new Worker(queue));
        workers.add(thread);
        thread.start();
    }

    long endTime = System.currentTimeMillis() + 10000;
    Random r = new Random();
    while(System.currentTimeMillis() < endTime) {
        try {
            CalculateJob job = new CalculateJob(r.nextInt(50), r.nextInt(50), r.nextInt(50));
            queue.put(job);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }   

所以我的主线程将用于创建线程,而工作者只是坐在queue.take()

我是否正确理解在对等模型中,每个线程必须queue.take()或等待作业。如果是这样,我该怎么做?有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您链接的文章未说明如何创建作业。他们可能意味着他们是从别处创造的。查看各个模型的数据,我们看到:

  • 在“委托模型”中,主线程决定哪个工作线程将执行作业
  • 在“对等模型”中,对等线程从公共队列中获取工作(无论哪个线程首先获得下一个Job),因此对等线程自己协调。

通过使用ConcurrentQueue,您实际上已实现了对等模型。

总而言之,它们的区别在于线程如何协调工作,而不是如何创建工作。

答案 1 :(得分:1)

建议您自己提供的文章

  

在对等模型中,所有线程都具有相同的工作状态。虽然有一个线程最初创建执行所有任务所需的所有线程,但该线程被视为工作线程并且不进行委派

您的Boss线程恰好也是工作人员将创建放入队列中的作业,并且一旦完成放置作业,就可以通过调用take()来充当工作人员。

现在,如果您想要阻止所有线程,直到Boss线程完成创建作业,那么您可以使用CountDownLatch进行单次计数。

我真的不知道这个模型是否对我们的生产者/消费者模型有任何好处。

答案 2 :(得分:0)

虽然这个问题用标记,并且因为 workcrew model 听起来好像是一般的并发概念,所以我在C中添加了伪代码。

  

在对等模型中,也称为工作螺杆模型,必须有一个线程   程序启动时创建所有其他对等线程。这个帖子   随后充当另一个处理请求的对等线程,   或暂停等待其他同行完成。同行   model使每个线程负责自己的输入。同行知道   它自己提前输入,有自己的私有方式来获取它   输入,或与其他同伴共享单点输入。

enter image description here

main()
{
   pthread_create( ... thread1 ... task1 )
   pthread_create( ... thread2 ... task2 )
   .
   .
   .
   signal all workers to start
   wait for all workers to finish
   do any clean up
}

task1()
{
   wait for start
   perform task, synchronize as needed if accessing shared resources
   done
}

task2()
{
   wait for start
   perform task, synchronize as needed if accessing shared resources
   done
}

所有来源均来自PThreads Programming - A POSIX Standard for Better Multiprocessing, Buttlar, Farrell, Nichols