java - 使用 Join 方法的不同输出

标签 java multithreading join

我阅读了一些教程,甚至已经提出了问题 here

但是我又对 join 方法感到困惑。 我所知道的Java不能保证正常情况下线程的执行顺序。

我使用 join() 阅读的内容,它确保一旦线程调用 join,当前线程将不会执行,除非您调用的线程已完成。

我试过的例子

public class ThreadTest1 extends Thread{

    @Override
    public void run() {
        super.run();
        for(int i=0; i<10; i++)
        {
            System.out.println(i + "   :"+ Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {

        System.out.println("Thread is getting started");
        ThreadTest1 th0= new ThreadTest1();
        th0.start();
        ThreadTest1 th1= new ThreadTest1();
        th1.start();
        try {
            th1.join(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

输出:

First time output
0   :Thread-1
1   :Thread-1
2   :Thread-1
0   :Thread-0
3   :Thread-1
1   :Thread-0
4   :Thread-1
2   :Thread-0
5   :Thread-1
3   :Thread-0
6   :Thread-1
4   :Thread-0
7   :Thread-1
8   :Thread-1
9   :Thread-1
5   :Thread-0
6   :Thread-0
7   :Thread-0
8   :Thread-0
9   :Thread-0
Second time output:
0   :Thread-1
0   :Thread-0
1   :Thread-1
1   :Thread-0
2   :Thread-1
2   :Thread-0
3   :Thread-1
3   :Thread-0
4   :Thread-1
4   :Thread-0
5   :Thread-1
5   :Thread-0
6   :Thread-1
6   :Thread-0
7   :Thread-1
7   :Thread-0
8   :Thread-1
8   :Thread-0
9   :Thread-1
9   :Thread-0

为什么两个输出不同。

我将 join() 与 th1 对象一起使用。当 th0 正在运行并且 jvm 找到 th1 线程时,所以线程 1 应该先完成,然后是线程 0。

为什么它打印 Thread-1,Thread-0 没有任何顺序。如果输出是这样的,那么 join() 方法有什么用?

谁能用我的输出解释一下。

最佳答案

这里的问题是两个线程独立启动并开始打印内容,th0.startth1.start 之间发生的事情是不确定的。

此外,它是您的应用程序的主系统线程正在等待th1 完成,th0th1 彼此独立地执行他们的run方法,这就是为什么每次你得到一个不同的序列。

关于java - 使用 Join 方法的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639806/

相关文章:

java - 从数组列表中安全地删除数据

java - 静态方法是隐式线程安全的吗?

java - 在 Java FX 工作线程中不断更新 UI

java xml解析错误打印节点值

java - 线程的ThreadLocals清理

c++ - 以更安全的方式将资源移动到新线程

java - 为什么无法使用 JPA TopLink 注释连接第三个表?

sql - 在 T-SQL 中对两列进行外连接并跳过 Null

MySQL查询连接3个表并计数

java - 如何创建链接以在 java (netbeans) 的新选项卡中打开网站