我正在研究java中的线程。
我只想要一个简单的例子来解释在线程中使用 join()
。我看过这个链接..
Understanding join() method example
但仍然无法理解这个概念。
任何人都可以向我解释在线程中使用join()
的概念。
任何与此相关的解释对我都非常有帮助。
感谢。
答案 0 :(得分:2)
我可以提出的最简单的解释是join使调用者线程等待指定线程的完成。
假如你有一个“主线程”和“线程A”,如果你从主线程调用A.join(),主线程将等到线程A完成。
有关并发性的java se手册页应该可以帮助您:http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
答案 1 :(得分:1)
Thread.join()
导致当前线程等待您调用join()
的线程在其恢复执行之前死亡。
答案 2 :(得分:0)
Thread.join()阻止(不返回),直到你加入的线程结束。
这不是等待线程完成的唯一方法,但它是最友好的CPU使用方式。想象一下,如果你有这样的循环(伪代码):
while(!thread.isAlive())
{
Sleep(1);
}
这应该做同样的事情......但是,每秒1000次,它会醒来,检查变量然后再回去睡觉。这意味着1000个上下文切换(这是昂贵的),因此程序将更慢。这被称为'自旋锁'或'忙等待',并且在编程时不赞成,因为它无缘无故地消耗CPU。
答案 3 :(得分:0)
我做了一些实验,结果如下: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();
}
}