简单的例子来理解Thread中的join()概念

时间:2013-01-25 05:07:33

标签: java multithreading

我正在研究java中的线程。

我只想要一个简单的例子来解释在线程中使用 join() 。我看过这个链接..

Understanding join() method example

但仍然无法理解这个概念。

任何人都可以向我解释在线程中使用join()的概念。

任何与此相关的解释对我都非常有帮助。

感谢。

4 个答案:

答案 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();

    }
}