考虑以下代码:
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
,依此类推。但是,它无法安排t1
与t2
相关的运行方式。特别是,它也不会延迟t2
的启动。当您说t2
时,t2.start()
开始。Okay,so how do I tell the others to wait as well?
理想情况下,您使用诸如工作队列和执行程序服务之类的更高级别的构造,而不是与低级别的线程原语打乱。
如果您确实想继续这样做,请查看
ReentrantLock
或CountDownLatch
。或者让t1
调用t2.join()
。我可能会使用
CountDownLatch
。将闩锁设置为需要五张票,然后您的每个线程都可以打印第一行,然后在闩锁处阻塞,并且只有在闩锁释放时(所有五个都到达时才发生),它们才会继续打印第二行。还要注意,如果您要一个接一个地运行这些任务,则根本不需要多个线程。只需在同一线程上执行
t1.run(); t2.run(); t3.run();
。
关于java - 等待一个线程以.join不一致结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62428618/