首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java点对点线程模型,每个人都在等待作业

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

Stack Overflow用户
提问于 2012-09-30 11:07:33
回答 4查看 1.3K关注 0票数 2

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

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

如果委托模型有一个将任务委托给工作线程的boss线程,则对等模型中的-所有线程都具有相同的工作状态。虽然有一个线程最初创建执行所有任务所需的所有线程,但该线程被认为是一个工作线程,不进行任何委托。在该模型中,没有集中式线程。

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

代码语言:javascript
复制
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() 或等待作业。如果是的话,我怎样才能做到呢?有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-30 11:31:01

你所链接的那篇文章并没有说明就业是如何创造的。它们可能意味着它们是从其他地方创造出来的。从有关模型的数字来看,我们看到:

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-30 11:31:16

按照建议,你提供的那篇文章

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

您的Boss线程(碰巧也是worker )将创建放在队列中的工作,并且在完成作业后调用take(),就像worker一样。

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

我真的不知道这种模式是否有什么优势,我们的生产者/消费者模式。

票数 1
EN

Stack Overflow用户

发布于 2017-07-31 11:06:16

虽然这个问题是用java标记的,而且由于workcrew模型听起来好像是一个通用的并发概念,所以我在C中添加了psuedo代码。

在对等模型(也称为workcrew模型)中,当程序启动时,一个线程必须创建所有其他对等线程。该线程随后充当处理请求的另一个对等线程,或挂起自身,等待其他对等线程完成。对等模型使每个线程负责自己的输入。同侪提前知道自己的输入,有自己的私有方式获取自己的输入,或者与其他对等方共享一个输入点。

代码语言:javascript
复制
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编程-更好的多处理的POSIX标准,Buttlar,Farrell,Nichols

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12660754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档