Java 控制线程的执行顺序
我正在尝试测试一个多线程场景,其中线程以特定顺序执行,因此我可以确信我在这个场景中有正确的行为 比如说: ThreadA有方法Java 控制线程的执行顺序,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在尝试测试一个多线程场景,其中线程以特定顺序执行,因此我可以确信我在这个场景中有正确的行为 比如说: ThreadA有方法1()和2()。ThreadB有方法3()和4() 我希望执行的顺序是: ThreadA.1() ThreadB.3() ThreadA.2() ThreadB.4() 我可以通过向ThreadA和ThreadB传递一个命令来实现这一点,告诉它们要执行什么方法,并在重新启动下一个线程之前在每个线程上进行连接 我只是想知道是否有更优雅的方法来做这个 注意,这是测试代
1()
和2()
。ThreadB有方法3()
和4()
我希望执行的顺序是:
ThreadA.1()
ThreadB.3()
ThreadA.2()
ThreadB.4()
我可以通过向ThreadA和ThreadB传递一个命令来实现这一点,告诉它们要执行什么方法,并在重新启动下一个线程之前在每个线程上进行连接
我只是想知道是否有更优雅的方法来做这个
注意,这是测试代码,我希望测试某个场景
非常感谢。这个问题问得很糟糕(你说classA有方法1()和方法2(),但是……然后你的示例根本没有遵循这一点 但是,如果您想在线程之间添加某种顺序的相似性,而不显式地联接()或运行()它们,则可以让它们相互访问(例如,使用一个充当易于访问的中介的单例类),并且,当您希望一个线程等待另一个线程执行特定任务时,可以在while循环内的同步块中使用wait语句,如下所示:
while (!Singleton.finished()) {
synchronized (this) {
wait();
}
}
让每个线程在生产者-消费者队列上等待。将同时包含类实例和状态变量的对象提交到队列1。在线程1中,执行classA.1()并将对象提交到队列2。在线程2中,执行classB.2()并将对象提交到队列1 不要将join、synchronize等与任何琐碎的线程一起使用——你只会陷入死锁、性能低下和调试噩梦般的混乱 在p-C队列上传递对象-死锁虽然不是不可能,但非常困难:)
如果你可以在任何地方安排任何与线程无关的东西,你应该这样做。如果你只有执行顺序,为什么你想要两个线程?一个接一个地执行 无论如何,您可以使用以下代码:
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();
}
正如您所看到的,没有优雅的方法可以做到这一点。如果您想要顺序执行,那么为什么要使用多个线程?“ClassB有方法3()和4()。”然后是“ClassB.2()”。但是classB没有方法2()…这不是一开始就违背了线程的观点吗?这是测试代码。我想测试一个特定的场景。请看下面的答案:我更新了一个问题以使事情更清楚。谢谢你的评论。