2015-08-08 42 views
0

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

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

T1 1

T2 2

T3 3

T1 4

T2 5

T3 6

T1 7

请注意没有。的线程被用作来自用户的输入并且不被硬编码。

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

请帮助一个代码片段。

+0

在某处收集结果并对它们进行排序。 –

+0

您的尝试在哪里? – SMA

+0

我投票结束这个问题作为题外话,因为它是一个家庭作业问题,它不包括迄今为止解决问题所完成的工作所需的总结,也没有描述解决它时遇到的困难。 – RealSkeptic

回答

0

如果您有n个线程,则创建一个由n个二进制信号量组成的数组(也称为锁或非递归互斥锁)。信号量[]锁=新的信号量[n]; 在启动线程之前,将所有的锁初始化为0. 每个线程例程都应该得到它的编号,这样线程0将有一个局部变量,表示它是线程0. 现在每个线程例程都应该以锁定开始[¡]。锁();并以锁[(i + 1)%n] .unlock()结束;

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

这里的一般想法或配方是线程同步。您首先将锁初始化为锁,然后按照您要创建序列的顺序解锁它们。这与线程保护形成对比,在线程保护中,您通常以处于解锁状态的锁开始,并在您处于关键部分时将其锁定。

回到你的问题,如果你想让这些线程转动。你可以这样做: (JAVA)

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

因此,例如线程0将得到锁止单元和块,直到主线程完成启动所有线程,当主线程调用锁[0]。解锁(),线程0将执行任务,解锁线程并返回锁定[0]锁定,因为它没有解锁它,线程0将等待最后一个线程,它会在程序结束时解锁它。

编辑:

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

+2

你有提到“当主线程调用锁[0] .unlock()时,线程0将执行任务,**解锁线程**并返回”线程将如何解锁先前由主线程锁定的锁?我相信它不适用于Mutex,因为只有相同的线程才能锁定和解锁互斥锁。 – sjain

+0

@SaharshJ,你是对的。大多数互斥锁都是递归的,并且由锁定它的线程拥有。在这里,我使用“互斥体”作为二进制信号量,看到这个答案http://stackoverflow.com/a/189778/2777540。我相信pthread和Java Mutex确实是递归的。让我编辑答案以避免混淆,并感谢您的评论 –