无法理解线程join()

时间:2018-06-29 09:45:00

标签: java multithreading

我是多线程新手。我知道关于线程的以下事情:

  • thread_obj.join()保持线程直到线程结束

  • thread_obj.join(5000)将线程保持5秒钟。之后再作为其他线程运行。

我知道join()join(millis)拥有线程一段时间。我的问题是,如果我们在join()中提供更多的时间,然后在sleep()中像join(5000)sleep(1000)一样运行,它将保持良好状态并保持线程5秒钟。之后,您可以像其他线程一样运行,但是如果您在join()中提供的时间较少,则sleep()join(500)之类的sleep(2000)将保持线程join()直到结束。 / p>

我有以下我不理解的代码join()

public class THRD3 extends Thread { 
    public void run() {
        for(int i = 1 ; i <= 10 ; i++) {
            System.out.println(Thread.currentThread().getName()+" : "+i);

            try { 
                //Thread.sleep(500); 
                Thread.sleep(2000);
            }
            catch (InterruptedException e) {e.printStackTrace();}
        }
    }
    public static void main(String[] args) throws InterruptedException {    
        THRD3 obj = new THRD3();
        THRD3 obj1 = new THRD3();
        THRD3 obj2 = new THRD3();

        obj.start();
        obj.setName("Joined Thread 0");

        //obj.join(2000);
        obj.join(500);

        obj1.start();
        obj2.start();
    }
}

2 个答案:

答案 0 :(得分:6)

调用connection.set_default_connection('connection1') 使调用线程等待线程完成执行。这意味着它将在该语句上被“阻止”,直到执行完成后才继续。传递参数使您可以指定超时,这意味着调用线程将等待该线程完成,或者在超时过去后放弃。

在您的代码Thread.join中,您的主线程什么也不做,请等到obj.join(500)线程完成,或者直到500毫秒过去,以先到者为准。

答案 1 :(得分:3)

您的基本假设是join()“将”相关线程“错误地”保留。 Thread#join()Thread#join(long millis)是同步结构,即您可以使用它们来等待线程终止。

来自the documentation of Thread#join()

  

等待该线程死亡。

     

此方法的调用与该调用的行为完全相同

join(0)

来自the documentation of Thread#join(long millis)

  

此线程死亡最多等待毫秒。超时为0表示永远等待。