-1

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

假设: ThreadA 有方法1()2(). ThreadB 有方法3()4().

我希望执行顺序是:

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

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

我只是想知道是否有更优雅的方法来做到这一点。

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

非常感谢。

4

3 回答 3

1

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

不要将连接、同步等与任何无关紧要的线程内容一起使用——你只会陷入一团糟的死锁、糟糕的性能和噩梦般的调试。

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

如果您可以在任何地方安排任何与线程无关的东西,那么您应该这样做。

于 2012-06-24T02:13:56.103 回答
0

好吧,这个问题被问得很糟糕(你说classA有方法1()和2(),但是......那么你的例子根本没有遵循。

但是,如果您想在线程之间添加一些相似的顺序而不显式地 join()ing 或 run()ing 它们,您可以让它们相互访问(例如,使用单例类,这将作为一个简单的 -可访问的中介),并且,一旦您希望一个线程等待另一个线程执行某个任务,您可以在 while 循环内的同步块中使用等待语句,如下所示:

while (!Singleton.finished()) {
    synchronized (this) {
        wait();
    }
}
于 2012-06-23T23:48:43.690 回答
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();
}

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

于 2012-06-24T11:16:32.417 回答