我正在研究java中的线程。
我只想要一个简单的例子来解释join()
线程中的使用。我看过这个链接。。
但仍然无法理解这个概念。
谁能解释一下使用join()
in Thread 的概念。
任何与此相关的解释都会对我很有帮助。
谢谢。
我正在研究java中的线程。
我只想要一个简单的例子来解释join()
线程中的使用。我看过这个链接。。
但仍然无法理解这个概念。
谁能解释一下使用join()
in Thread 的概念。
任何与此相关的解释都会对我很有帮助。
谢谢。
我能想到的最简单的解释是 join 使调用者线程等待指定线程的完成。
假设你有一个“主线程”和“线程 A”,如果你从主线程调用 A.join(),主线程将等到线程 A 完成。
关于并发的 java se 手册页应该在这里为您提供帮助:http: //docs.oracle.com/javase/tutorial/essential/concurrency/join.html
Thread.join()
join()
导致当前线程在恢复执行之前等待您调用的线程死亡。
Thread.join() 阻塞(不返回),直到您加入的线程完成。
这不是等待线程完成的唯一方法,但它是对 CPU 使用最友好的方法。想象一下,如果你有这样的循环(伪代码):
while(!thread.isAlive())
{
Sleep(1);
}
这应该做同样的事情......但是,每秒 1000 次,它会醒来,检查变量并重新进入睡眠状态。这意味着 1000 次上下文切换(这很昂贵),因此程序会变慢。这被称为“自旋锁定”或“忙于等待”,并且在编程中不受欢迎,因为它无缘无故地消耗 CPU。
我做了一些实验,结果如下: 1. 首先启动线程 t3。2. 启动 t1 然后 3. 创建 t2 并且 t2 加入了正在运行的线程 t1。根据定义,t2 应该等待 t1 死亡,然后它应该开始。
观察:我在 t1 上调用了等待,所以 t1 暂停但没有死,但我看到然后 t2 开始了,为什么?
public class TestThreadJoin {
public static void main(String[] args) {
final Thread t3 = new Thread(new Runnable() {
public void run() {
System.out.println("R3");
}
});
t3.start();
final Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("R1 before");
try {
perform();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("R1 after");
}
private void perform() throws InterruptedException {
synchronized(this){
wait(5000);
}
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("R2");
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
}
}