【问题标题】:cant understand Thread join()无法理解 Thread join()
【发布时间】:2018-12-08 11:31:46
【问题描述】:

我是多线程的新手。关于线程,我知道以下几点:

  • 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() 将保持线程直到结束。

我有以下我不理解的代码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();
    }
}

【问题讨论】:

  • @Lino 它不是重复的,因为 OP 要求 Thread#join(long millis),而不是 Threa#join()
  • @Turing85 那么这可能是一个更好的副本:stackoverflow.com/questions/20426863/…
  • 无论哪种方式,join 都不会停止线程。它只是等待它完成(或超时,以先发生者为准)
  • 我知道join 持有线程一段时间。为此我在我的代码中定义

标签: java multithreading


【解决方案1】:

调用Thread.join 使调用线程等待线程完成执行。这意味着它将在该语句上“阻塞”,并且在执行完成之前不会继续。传递一个参数可以让你指定一个超时,这意味着调用线程将等到线程完成,或者在超时过去时放弃。

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

【讨论】:

  • 很好解释...+1
  • 在睡眠和加入方法上更改时间后查看代码输出,我在注释行中给出并运行...在比较两个输出之后。你会看到差异。
  • .. 或任何其他线程会中断当前线程,这将导致 InterruptedException。在这种情况下,当前线程没有等到超时,也没有等到加入的线程终止。
【解决方案2】:

您的基本假设是join()“持有”有问题的线程是错误的。 Thread#join()Thread#join(long millis) 是同步结构,即我们使用它们来等待线程终止。

来自the documentation of Thread#join()

等待此线程终止。

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

join(0)

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

最多等待几毫秒让该线程终止。超时 0 意味着永远等待。

【讨论】:

  • 你是对的join() 等待线程死亡和join(5000) 在作为其他线程运行后给线程一个时间片....但是请运行代码,并且在sleep()join() 并在重新运行并比较这两个输出之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多