-1

我正在研究java中的线程。

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

了解 join() 方法示例

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

谁能解释一下使用join()in Thread 的概念。

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

谢谢。

4

4 回答 4

2

我能想到的最简单的解释是 join 使调用者线程等待指定线程的完成。

假设你有一个“主线程”和“线程 A”,如果你从主线程调用 A.join(),主线程将等到线程 A 完成。

关于并发的 java se 手册页应该在这里为您提供帮助:http: //docs.oracle.com/javase/tutorial/essential/concurrency/join.html

于 2013-01-25T05:10:52.927 回答
1

Thread.join()join()导致当前线程在恢复执行之前等待您调用的线程死亡。

于 2013-01-25T05:10:50.643 回答
0

Thread.join() 阻塞(不返回),直到您加入的线程完成。

这不是等待线程完成的唯一方法,但它是对 CPU 使用最友好的方法。想象一下,如果你有这样的循环(伪代码):

while(!thread.isAlive())
{
 Sleep(1);
}

这应该做同样的事情......但是,每秒 1000 次,它会醒来,检查变量并重新进入睡眠状态。这意味着 1000 次上下文切换(这很昂贵),因此程序会变慢。这被称为“自旋锁定”或“忙于等待”,并且在编程中不受欢迎,因为它无缘无故地消耗 CPU。

于 2013-01-25T05:22:08.750 回答
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();

    }
}
于 2014-09-09T04:46:31.727 回答