如果 join 阻塞了主线程,为什么它不阻塞在循环中?

Thread 实例的 join() 方法可用于将一个线程的执行开始“连接”到另一个线程的执行结束,以便一个线程在另一个线程结束之前不会开始运行。如果在 Thread 实例上调用 join(),则当前正在运行的线程将阻塞,直到 Thread 实例完成执行


但是如果 ia 有多个线程并且当我在循环内调用 join 时。所有线程并行运行。但是根据连接概念,首先连接的线程应该完成,然后只有主线程应该允许连接其他线程。


public class MultiThreading implements Runnable {



private int name;

public MultiThreading(int number) {

    name =number;

}


@Override

public void run() {

    for (int i = 0; i <= 10; i++ ) {


           System.out.println("Thread number :" + name +" Printed value "+i);


        try {

            Thread.sleep(100);

        } catch (final InterruptedException e) {

            return;

        }

    }

}



public static void main(String[] args) throws InterruptedException {


    final Thread[] workers = new Thread[3];

    for (int i = 0; i < nthreads; ++i) {

        workers[i] = new Thread(new MultiThreading(i));

    }

    for (final Thread t : workers) {

        t.start();


    }


    for (final Thread t : workers) {

        t.join();

        System.out.println("Thread joind to main thread : " + t.getName());

    }

    System.out.println("Main thread ends");

}

}


在上面的代码中,如果第一个线程被加入,那么主线程应该被阻塞并且不应该让其他线程加入(直到被加入的线程完成run方法的执行)。但是所有线程都是并行连接的。输出就像 -


Thread number :0 Printed value 0

Thread number :1 Printed value 0

Thread number :2 Printed value 0

Thread number :0 Printed value 1

Thread number :1 Printed value 1

Thread number :2 Printed value 1

Thread number :0 Printed value 2

Thread number :1 Printed value 2

Thread number :2 Printed value 2

Thread number :0 Printed value 3

Thread number :1 Printed value 3

Thread number :2 Printed value 3

Thread number :0 Printed value 4

Thread number :1 Printed value 4

Thread number :2 Printed value 4

Thread number :1 Printed value 5


人到中年有点甜
浏览 121回答 1
1回答

犯罪嫌疑人X

首先:Thread 实例的 join() 方法可用于将一个线程执行的开始“连接”到另一个线程执行的结束这是一个误解:这与启动线程无关。Join 仅执行此操作:正在运行的线程将等待另一个线程结束。当您这样做时someThread.join(),调用该方法的线程将等到 someThread 结束!但是所有线程都是并行连接的。是的,因为它们都完成了。您的线程执行所有完全相同的事情,所以除了这里或那里的几纳秒之外(由于写入 System.out 无论如何都有效地同步内容,这大部分是无效的)它们都需要相同的时间。所以当你加入第一个线程时......其他两个线程将完成。因此,第一次调用join()使“主”线程等待第一个线程结束,随后的调用“立即”发生,因为这些线程也已完成。为了延迟事情,将循环次数作为您的MultiThreading类的参数,然后确保您的线程需要不同的时间量。如果 Thread-0 执行 10 次循环,Thread-1 执行 20 次,而 Thread-2 执行 30 次,您将看到每个连接实际上都在等待相应的线程结束。长话短说:您立即启动所有线程,因此它们立即开始并行运行。后面的 join 调用只是延迟主线程的运行,直到每个工作线程都结束。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java