控制线程的执行顺序

时间:2012-06-23 22:35:12

标签: java multithreading concurrency

我正在尝试测试多线程场景,其中线程以特定顺序执行,因此我可以确信我对此场景有正确的行为。

让我们说: ThreadA有方法1()2()。 ThreadB有方法3()4()

我希望执行顺序为:

ThreadA.1() 
ThreadB.3() 
ThreadA.2()
ThreadB.4() 

我可以通过向ThreadA和ThreadB传递一个命令来告诉他们在重新启动下一个线程之前执行什么方法以及通过在每个线程上加入。

我只是想知道这样做是否更优雅。

注意,这是测试代码,我希望测试某个场景。

非常感谢。

3 个答案:

答案 0 :(得分:1)

让每个线程等待生产者 - 消费者队列。将包含类实例和状态变量的对象提交到队列1.在线程1中,执行classA.1()并将对象提交到队列2.在线程2中,执行classB.2()并将对象提交到队列1 .....

不要使用连接,同步等任何超出微不足道的线程 - 你将陷入一堆乱码,糟糕的性能和噩梦调试。

在P-C队列上传递对象 - 死锁虽然不是不可能,但非常困难:)

如果你可以安排任何东西,任何地方都是与线程无关的,你应该这样做。

答案 1 :(得分:0)

嗯,这个问题被严重地问了(你说classA有方法1()和2(),但是......那么你的例子根本就没有。

但是,如果你想在线程之间添加一些相似的顺序而没有明确地连接()或运行()它们,你可以让它们相互访问(例如,使用单例类,它将充当一个易于访问的中介),并且,一旦你想要一个线程等待另一个线程执行某个任务,你就可以在while循环中的synchronized块中使用wait语句如下:

while (!Singleton.finished()) {
    synchronized (this) {
        wait();
    }
}

答案 2 :(得分:0)

如果您只有执行顺序,为什么要2个线程?只需一个接一个地执行它们。

无论如何,您可以使用以下代码:

void synchronized executor(){
    Thread threadA = new Thread( new Runnable(){
       @Override
       void run(){
            classA.1();//or the equivalent object
            Thread.notify();
       }
    }
    threadA.run();
    threadA.wait();
    Thread threadB = new Thread( new Runnable(){
       @Override
       void run(){
            classB.3();//or the equivalent object
            Thread.notify();
       }
    }
    threadB.run();
    threadB.wait();
    Thread threadA = new Thread( new Runnable(){
       @Override
       void run(){
            classA.2();//or the equivalent object
            Thread.notify();
       }
    }
    threadA.run();
    threadA.wait();
    Thread threadB = new Thread( new Runnable(){
       @Override
       void run(){
            classB.4();//or the equivalent object
            Thread.notify();
       }
    }
    threadB.run();
}

正如您所看到的,没有优雅的方法可以做到这一点。