为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2023-02-23 16:30:48
Thread 实例的 join() 方法可用于将一个线程的执行开始“连接”到另一个线程的执行结束,以便一个线程在另一个线程结束之前不会开始运行。如果在 Thread 实例上调用 join(),则当前正在运行的线程将阻塞,直到 Thread 实例完成执行但是如果 ia 有多个线程并且当我在循环内调用 join 时。所有线程并行运行。但是根据连接概念,首先连接的线程应该完成,然后只有主线程应该允许连接其他线程。public class MultiThreading implements Runnable {private int name;public MultiThreading(int number) {    name =number;}@Overridepublic 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 0Thread number :1 Printed value 0Thread number :2 Printed value 0Thread number :0 Printed value 1Thread number :1 Printed value 1Thread number :2 Printed value 1Thread number :0 Printed value 2Thread number :1 Printed value 2Thread number :2 Printed value 2Thread number :0 Printed value 3Thread number :1 Printed value 3Thread number :2 Printed value 3Thread number :0 Printed value 4Thread number :1 Printed value 4Thread number :2 Printed value 4Thread number :1 Printed value 5
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

首先:

Thread 实例的 join() 方法可用于将一个线程执行的开始“连接”到另一个线程执行的结束

这是一个误解:这与启动线程无关。Join 仅执行此操作:正在运行的线程将等待另一个线程结束。

当您这样做时someThread.join(),调用该方法的线程将等到 someThread 结束!

但是所有线程都是并行连接的。

是的,因为它们都完成了。

您的线程执行所有完全相同的事情,所以除了这里或那里的几纳秒之外(由于写入 System.out 无论如何都有效地同步内容,这大部分是无效的)它们都需要相同的时间。

所以当你加入第一个线程时......其他两个线程将完成。因此,第一次调用join()使“主”线程等待第一个线程结束,随后的调用“立即”发生,因为这些线程也已完成。

为了延迟事情,将循环次数作为您的MultiThreading类的参数,然后确保您的线程需要不同的时间量。如果 Thread-0 执行 10 次循环,Thread-1 执行 20 次,而 Thread-2 执行 30 次,您将看到每个连接实际上都在等待相应的线程结束。

长话短说:您立即启动所有线程,因此它们立即开始并行运行。后面的 join 调用只是延迟线程的运行,直到每个工作线程都结束。



查看完整回答
反对 回复 2023-02-23
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信