Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 控制线程的执行顺序_Java_Multithreading_Concurrency - Fatal编程技术网

Java 控制线程的执行顺序

Java 控制线程的执行顺序,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在尝试测试一个多线程场景,其中线程以特定顺序执行,因此我可以确信我在这个场景中有正确的行为 比如说: ThreadA有方法1()和2()。ThreadB有方法3()和4() 我希望执行的顺序是: ThreadA.1() ThreadB.3() ThreadA.2() ThreadB.4() 我可以通过向ThreadA和ThreadB传递一个命令来实现这一点,告诉它们要执行什么方法,并在重新启动下一个线程之前在每个线程上进行连接 我只是想知道是否有更优雅的方法来做这个 注意,这是测试代

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

比如说: ThreadA有方法
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()…这不是一开始就违背了线程的观点吗?这是测试代码。我想测试一个特定的场景。请看下面的答案:我更新了一个问题以使事情更清楚。谢谢你的评论。