Thread.Join没有按预期工作

时间:2017-08-29 12:26:08

标签: java multithreading

我正在研究一个使用join方法和Thread.sleep的小例子,但我很困惑流程是如何工作的。

这是我的计划:

public class Test implements Runnable {

    private String msg;
    private int seconds;

    public Reminder(int sec, String msg) {
        this.sec= sec;
        this.msg= msg;
    }

    public void run() {
        try {
            Thread.sleep(sec* 1000);
            System.out.print(msg+ " ");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Test(1, "one"));
        Thread t2 = new Thread(new Test(3, "two"));

        t2.start();
        t1.start();
        t2.join();
        t1.join();      
    }
}

由于我正在调用t2.join()t2线程应该在t1线程完成之前完成。

所以我希望输出为two one,但我的输出为one two

5 个答案:

答案 0 :(得分:5)

  

由于我调用t2.join(),t2线程应该在t1之前完成   线程完成。

这是不正确的,join不会保证哪个线程会先完成,两个线程启动所以不保证哪一个先完成,join会阻塞主线程直到线程完成,所以基本上你所做的一切都是加入是你阻止主线程等待下一个完成可能已经完成的线程。

如果你想在t2完成后启动t1,那么你需要在t2结束后调用start,这里你可以使用join

 t2.start();
 t2.join();//main thread will stop here untill t2 is finished 
 t1.start()

这实际上不实用,因为它与在一个线程中执行任务之间没有真正的区别,只是创建线程的开销

答案 1 :(得分:2)

  

因为我正在调用t2.join(),所以t2线程应该在t1线程完成之前完成。

完全没有。等待t2结束 - 但这并不妨碍其他线程的进展。

因此,只有您假设的第一个部分是正确的。该代码等待t2完成。这对t1的“完整性”没有任何影响。

假设您有两个跑步者,从同一时间点开始。你坐在终点线上,你只能观察到较慢的跑步者。现在较慢的跑步者通过终点线。为什么你希望更快的跑步者仍在运行?当你只看着那个慢个子的时候,他就到了终点!

答案 2 :(得分:1)

  

由于我调用t2.join(),t2线程应该在t1之前完成   线程完成。

如果首先启动的<canvas id='c' width='300' height='300'></canvas>

之前终止执行,则不是这种情况

t1已执行。

要在t2.join();之前完成t2,请启动t1,然后在其上调用t2
然后启动join()

t1

但是它以某种方式在多线程中失败,因为每个线程只在前一个线程被终止时启动。

答案 3 :(得分:0)

调用start()后,线程开始立即运行。这包括了writeln()。

join()只是从线程中收集一些资源,阻塞直到线程在进程中完成。

答案 4 :(得分:0)

Join方法使主线程等待另一个线程完成执行,然后才能在join函数调用之后执行下一个代码。

这与你产生的两个或多个线程之间的相互关系无关。