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 调用只是延迟主线程的运行,直到每个工作线程都结束。
添加回答
举报
0/150
提交
取消