Java 正在等待线程结束。不一致地加入
考虑以下代码:Java 正在等待线程结束。不一致地加入,java,multithreading,Java,Multithreading,考虑以下代码: 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(); Th
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) {
}
}
}
我们的目标是在下一行中打印hello,than world。输出不正确,而且非常不一致,这意味着每隔几次测试它就会改变。我从未使用线程,但我做了一些研究,它说使用这个。join应该等待一个线程完成,以便下一个线程开始。我做错了什么
谢谢大家!
它说使用this.join应该等待一个线程完成,以便下一个线程启动
这不是join
所做的
join
阻止当前线程,直到目标线程完成。它对任何其他线程都没有任何作用
在您的情况下,主线程将等待t1
完成,然后等待t2
完成,依此类推。但是它并没有计划t1
如何相对于t2
运行。特别是,它也不会延迟启动t2
<当你说t2.start()
时,code>t2开始
好吧,那我怎么告诉其他人也等着呢 理想情况下,您可以使用更高级别的构造,如工作队列和执行器服务,而不是与低级线程原语混淆 如果要继续执行此操作,请查看
ReentrantLock
或countdownlock
。或者让t1
调用t2.join()
我可能会使用倒计时闩锁
。将闩锁设置为需要五个票证,然后每个线程都可以打印第一行,然后在闩锁处阻塞,并且只有当闩锁释放时(当所有五个都到达时发生),它们才会继续打印第二行
还要注意的是,如果您希望以一个接一个的顺序运行这些任务,那么根本不需要多个线程。只需执行
t1.run();t2.run();t3.run()代码>在同一线程上。很可能您的电脑速度太快-在创建线程2到5时,线程1可能已经完成。你要做的是告诉所有的线程:“去写你好,然后再写世界”。然后你等待第一个线程完成,但是其他所有线程都会在任何时候打印,他们觉得你可以将当前线程名称添加到输出中,然后看到所有的内容都已完成:-)好的,那么我如何告诉其他线程也要等待?等待一个线程完成,以便下一个线程开始?你为什么会这样认为?您发布的代码连续调用了五次start()
,但从未调用过join()
。好的,那么我如何安排它们呢?我需要同步它们吗?