gpt4 book ai didi

java - 等待一个线程以.join不一致结束

转载 作者:行者123 更新时间:2023-12-03 13:23:28 25 4
gpt4 key购买 nike

考虑以下代码:

    public class print extends Thread {

public void run() {
Out.print("Hello");
Out.println("World");
}
}

public class test {
public static void main (String[] args) {
Thread t1 = new print();
Thread t2 = new print();
Thread t3 = new print();
Thread t4 = new print();
Thread t5 = new print();

t1.start();
t2.start();
t3.start();
t4.start();
t5.start();

try {
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
}catch(InterruptedException e) {
}
}

}

目标是打印出问候,而不是下一行。输出不正确,并且非常不一致,这意味着每个测试都会更改。我从未使用过线程,但是我做了一些重新研究,表示使用此.join应该等待一个线程完成,以便下一个线程开始。我究竟做错了什么?

谢谢!

最佳答案

and it says that using this .join should wait for one thread to finish so that the next one starts



那不是 join所做的。
join阻塞当前线程,直到目标线程完成。它对任何其他线程不做任何事情。

在您的情况下,主线程将等待 t1完成,然后等待 t2,依此类推。但是,它无法安排 t1t2相关的运行方式。特别是,它也不会延迟 t2的启动。当您说 t2时, t2.start()开始。

Okay,so how do I tell the others to wait as well?



理想情况下,您使用诸如工作队列和执行程序服务之类的更高级别的构造,而不是与低级别的线程原语打乱。

如果您确实想继续这样做,请查看 ReentrantLockCountDownLatch。或者让 t1调用 t2.join()

我可能会使用 CountDownLatch。将闩锁设置为需要五张票,然后您的每个线程都可以打印第一行,然后在闩锁处阻塞,并且只有在闩锁释放时(所有五个都到达时才发生),它们才会继续打印第二行。

还要注意,如果您要一个接一个地运行这些任务,则根本不需要多个线程。只需在同一线程上执行 t1.run(); t2.run(); t3.run();

关于java - 等待一个线程以.join不一致结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62428618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com