【问题标题】:Different Output with Join methodJoin 方法的不同输出
【发布时间】:2015-08-18 19:50:18
【问题描述】:

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

但我再次对加入方法感到困惑。 我所知道的Java在正常情况下不能保证线程的执行顺序。

我使用 join() 读取的内容,它确保一旦线程调用 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() 方法有什么用?

谁能解释一下我的输出。

【问题讨论】:

  • th2.start(); 应该是 th1.start();,对吗? th/th0 也是一样。

标签: java multithreading join


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你能用下面的方法试试吗...

     try {
            th1.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    

    实际上,通过使用 join(10000) 方法,我们说要等待其他线程最多 10000 毫秒...如果其他线程没有在 10000 毫秒内完成,则开始执行当前线程。

    join()的使用并没有指定等待其他线程完成执行的时间……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多