【发布时间】:2019-06-28 06:48:29
【问题描述】:
Thread 实例的 join() 方法可用于将线程执行的开始“连接”到另一个线程执行的结束,这样一个线程在另一个线程结束之前不会开始运行。如果在 Thread 实例上调用 join(),则当前正在运行的线程将阻塞,直到 Thread 实例执行完毕
但是如果我有多个线程并且当我在循环内调用 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
Thread number :0 Printed value 5
Thread number :2 Printed value 5
Thread number :0 Printed value 6
Thread number :1 Printed value 6
Thread number :2 Printed value 6
Thread number :1 Printed value 7
Thread number :0 Printed value 7
Thread number :2 Printed value 7
Thread number :0 Printed value 8
Thread number :1 Printed value 8
Thread number :2 Printed value 8
Thread number :1 Printed value 9
Thread number :0 Printed value 9
Thread number :2 Printed value 9
Thread number :1 Printed value 10
Thread number :0 Printed value 10
Thread number :2 Printed value 10
Thread joind to main thread : Thread-0
Thread joind to main thread : Thread-1
Thread joind to main thread : Thread-2
Main thread ends
【问题讨论】:
-
你有什么问题?
-
@GhostCat 我看到了程序的输出,我不明白 OP 在期待什么。
-
@MauricePerry 在加入循环中,如果第一个线程被加入,为什么主线程没有被阻塞。它甚至在第一个加入的线程完成之前就允许其他线程加入。
-
@AnshulKabra 主线程被阻塞,直到第一个线程结束。
-
@GhostCat 非常感谢您的快速澄清。我感到困惑的原因是线程正在做同样的事情。我让第二个线程运行了更长的时间。
标签: java multithreading java-threads