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

Java点对点线程模型,每个人都在等待作业,java,multithreading,runnable,blockingqueue,Java,Multithreading,Runnable,Blockingqueue,这是一份作业。 我正在尝试创建点对点线程模型: 如果委派模型具有将任务委派给工作线程的boss线程,在对等模型中,所有线程的工作状态都相同。虽然有一个线程最初创建执行所有任务所需的所有线程,但该线程被视为工作线程,不进行委派。在这个模型中,没有集中式线程 因此,我的主线程将创建5个线程,这些线程开始侦听我的队列,并使用主线程创建作业10秒钟。由于所有线程都必须执行任务,因此该线程也必须等待作业。我该怎么做 BlockingQueue<Job> queue = new ArrayBl

这是一份作业。 我正在尝试创建点对点线程模型:

如果委派模型具有将任务委派给工作线程的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();
        }
    }   
BlockingQueue=newarrayblockingqueue(1000);
集合工人=新建ArrayList();
对于(int i=0;i<5;i++){
线程线程=新线程(新工作线程(队列));
workers.add(线程);
thread.start();
}
long-endTime=System.currentTimeMillis()+10000;
随机r=新随机();
while(System.currentTimeMillis()
因此,我的主线程将负责创建线程,而工作人员只是坐在
queue.take()
旁边


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

你链接到的文章没有说明如何创造就业机会。它们可能意味着它们是从其他地方创造出来的。查看各型号的数据,我们发现:

  • 在“委托模型”中,主线程决定哪个工作线程将执行作业
  • 在“对等模型”中,对等线程从一个公共队列中获得工作(并且无论哪个线程恰好是第一个线程,都会获得下一个作业),因此对等线程会进行自我协调
通过使用ConcurrentQueue,您实际上已经实现了对等模型


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

正如您提供的文章所建议的那样

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

您的Boss线程碰巧也是worker,它将创建放入队列中的作业,并可以在完成作业放入后通过调用
take()
来充当worker

现在,如果要在Boss线程完成创建作业之前阻止所有线程,则可以使用带有单个计数的
CountDownLatch


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

尽管这个问题被标记为workcrew模型,而且因为workcrew模型听起来似乎是并发的一般概念,我还是在C中添加了psuedo代码

在对等模型(也称为workcrew模型)中,必须有一个线程 在程序启动时创建所有其他对等线程。这根线 随后充当处理请求的另一个对等线程, 或者暂停自己,等待其他同行完成。同伴 模型使每个线程负责自己的输入。同龄人知道 它自己提前投入,有自己的私密方式获得自己的利益 输入,或与其他对等方共享单个输入点


所有来源都引用自

您已经回答了您的问题:)@AmitD是的,但当我的“主”线程忙于创建新作业并将它们添加到队列中时,我如何使用该线程完成作业?一旦一个工作线程创建了所有作业,它就可以在队列上调用take()。所以,您的所有工作人员都在队列上调用take(),以便它。是。正如我在回答中所说的,如果您想阻止工人工作直到Boss线程完成,那么您可以使用
CountDownLatch
。每个线程将在闩锁上调用
wait()
,一旦Boss完成,它将打开门,所有线程都可以开始工作。
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
}