在Java中的3个或更多线程之间进行排序

时间:2015-08-08 15:12:45

标签: java multithreading

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

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

T1 1

T2 2

T3 3

T1 4

T2 5

T3 6

T1 7

请注意不。线程被视为来自用户的输入,并且不是硬编码的。

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

请使用代码段来提供帮助。

1 个答案:

答案 0 :(得分:0)

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

结束

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

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

回到你的问题,如果你想让线程四处走动。你可以这样做: (Java)的

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

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

编辑:

你可以使用一个互斥和n个条件变量来获得类似的解决方案,但这个想法是一样的。