Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 - Fatal编程技术网

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()
。好的,那么我如何安排它们呢?我需要同步它们吗?