我想知道thread's
join()
方法的工作原理。我假设当我们在t.join()
之后给出t.start()
时,其余的线程可能是main
将在Thread t完成其进程后执行。当我执行以下代码时:
public class Run extends Thread {
void go(){
System.out.println(isAlive());
}
public static void main(String[] args) throws Exception{
Thread t=new Run();
t.start();
//t.join();
((Run)t).go();
}
}
我可以在输出中获得true
或false
。如果t.start()
在((Run)t).go()
之前执行,则输出将为true
或false
但我希望始终true
获得输出。所以我取消注释行t.join()
,以便main
线程的((Run)t).go()
在最后执行。但现在我总是得到false
的输出。我以为它是真的。任何人都可以清除我的困惑吗?我知道我没有包含Thread的run()
方法。
答案 0 :(得分:1)
https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join--
等待此线程死亡。
您的程序有两个线程:主线程和Run实例。当主线程调用t.join()
时,它将等待t
死亡,然后继续。因此,在Thread.join()
返回之后,根据定义,线程将会死亡。
答案 1 :(得分:0)
我想知道thread的join()方法是如何工作的。
它是如何工作的?或它做了什么?
它的作用是,t.join()
等待线程t
失效。 (即,你称之为,并且在t
死亡之前它不会返回。)
它是如何工作的,它位于循环中,测试线程的状态,如果线程还没有死,则调用t.wait()
。线程在死时所做的最后一件事就是更改其状态,然后调用t.notifyAll()
。
答案 2 :(得分:0)
但我希望始终获得输出
true
。所以我取消注释行t.join()
,以便主线程((Run)t).go()
在最后执行。
如果您希望结果为true
,则需要确保在检查时线程处于活动状态;最简单的方法是从正在运行的线程(即,来自线程的目标run()
方法)进行检查,但是如果需要从另一个线程进行检查,则需要创建同步线程之间的机制,如CountdownLatch
。然后,线程将等待直到主线程已检查其状态。
但是,这一切看起来都非常人为。 join()
方法等待另一个线程死亡。如果在join()
成功完成后检查该线程,当然您会看到它没有活动。
答案 3 :(得分:0)
join() - 等待线程死亡。enter code here
class JoinDemo{
Thread thread1 = new Thread(
new Runnable() {
public void run () {
//your code logic goes here
}
}
);
Thread thread2 = new Thread(
new Runnable() {
public void run () {
//your code logic goes here
}
}
);
thread1.start(); //line1
thread1.join(); //line2
thread2.start();//line3
}
这个例子中有3个线程,main,thread1,thread2。目前运行的线程即。 main将等待thread1死掉。在thread1死后,它将继续执行thread2。 因此主线程只有在thread1死后才会进入第3行。