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

标签 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();
    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/

相关文章:

java - 如何禁用所有网络共享数据的互联网

java - 使用套接字和线程的一个问题

windows - 监听多个套接字 : select vs. 多线程

java - 我可以将对象添加到队列中而不用担心它会在多线程应用程序中中断吗?

java - Java线程是如何工作的

java - 如何使用Spring Boot从数据库创建实体类?

java - 在执行过程中返回到 for 循环的顶部?

java - 存储经常使用的(不可更改的)List、Map 的最佳方式是什么?

java - 使用绑定(bind)到远程 MQ 的 JMS 连接

java - 黑莓中异步列表字段实现时出现 IllegalThreadStateException