【问题标题】:Sequencing among 3 or more threads in Java [duplicate]Java中3个或更多线程之间的排序[重复]
【发布时间】:2015-08-08 15:12:44
【问题描述】:

我们如何使用wait, notify(最好)或其他高级构造来确保 Java 中 3 个或更多线程之间的顺序。

例如,对于 3 个线程,分别打印 1,4,7... 2,5,8... 3,6,9... 的 T1、T2 和 T3 应按顺序执行 T1 > T2 > T3 > T1 > T2 > T3 > T1 以此类推... 最终输出如下所示:

T1 1

T2 2

T3 3

T1 4

T2 5

T3 6

T1 7

.

.

.

请注意没有。线程数作为用户的输入,没有硬编码。

我知道如果要按顺序运行多个线程是没有意义的,但这是一个实践问题。

请帮忙提供一个代码 sn-p。

【问题讨论】:

  • 在某处收集结果并对其进行排序......
  • 你的尝试在哪里?
  • 我投票决定将此问题作为题外话结束,因为它是一个家庭作业问题,其中不包括迄今为止为解决该问题所做的工作的必要摘要,也不包括对解决时遇到的困难。
  • 您可以使用 queue..FIFO 处理线程,以便保持顺序
  • 这个想法是使用三个监视器,每个过渡一个。 (T1->T2, T2->T3, T3->T1)。

标签: java multithreading


【解决方案1】:

如果您有 n 个线程,请创建一个包含 n 个二进制信号量(也称为锁或非递归互斥体)的数组。信号量 [] 锁 = 新信号量 [n]; 在启动线程之前,将所有锁初始化为 0。 每个线程例程都应该获取它的编号,以便线程 0 将有一个局部变量指示它是线程 0。 现在每个线程例程都应该以 locks[¡].lock();并以 locks[(i+1)%n].unlock();

结尾

然后启动所有线程。并调用 locks[0].unlock()

这里的总体思路或秘诀是线程同步。您从初始化为锁定的锁开始,然后按照您想要创建序列的顺序解锁它们。这与线程保护相反,在线程保护中,您通常从处于未锁定状态的锁开始,并在您处于临界区时锁定它们。

回到你的问题,如果你想让线程一圈又一圈。你可以这样做: (java)

void run()
{
    while(isRunning)
    {
        lock[i].lock();
        ////Your task
        lock[(i+1)%n].unlock();
     }
 }

例如线程 0 会到达锁​​定部分并阻塞,直到主线程完成启动所有线程,当主线程调用 locks[0].unlock() 时,线程 0 将执行任务,解锁线程并返回在 lock[0] 上被锁定,因为它没有解锁它,线程 0 将等待最后一个线程,该线程将在其例程结束时解锁它。

编辑:

你可以有一个类似的解决方案,一个互斥体和n个条件变量,但想法是一样的。

【讨论】:

  • 你有提到“当主线程调用 locks[0].unlock() 时,线程 0 将执行任务,解锁线程并返回”线程将如何解锁之前被主线程锁定的锁?我相信 Mutex 不可行,因为只有同一个线程可以锁定和解锁 Mutex。
  • @SaharshJ,你是对的。大多数互斥锁都是递归的,并且归锁定它的线程所有。在这里,我使用“互斥量”作为二进制信号量,请参阅此答案 stackoverflow.com/a/189778/2777540 。我相信 pthreads 和 Java Mutexes 确实是递归的。让我编辑答案以避免混淆,谢谢你的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多