有时候我们需要在当前线程等待在其他线程执行结束后,将这些线程处理的结果汇总。简单将就是阻塞等待其他线程结束。通过join方法即可实现。
代码如下:
public class Async2Sync {
static volatile int count1 = 0;
static volatile int count2 = 0;
public static void main(String[] args) throws InterruptedException {
Thread backThread1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500L);
System.out.println("backThrad1: count1 = "+count1);
count1++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread backThread2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500L);
System.out.println("backThrad2: count2 = "+count2);
count2++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
backThread1.start();
backThread2.start();
backThread1.join();
backThread2.join();
Thread.sleep(1300L);
System.out.println("main: count = " + (count1 + count2));
System.out.println("main End");
}
}
打印结果如下
> Task :Async2Sync.main()
backThrad2: count2 = 0
backThrad1: count1 = 0
backThrad2: count2 = 1
backThrad1: count1 = 1
backThrad2: count2 = 2
backThrad1: count1 = 2
backThrad1: count1 = 3
backThrad2: count2 = 3
backThrad1: count1 = 4
backThrad2: count2 = 4
backThrad2: count2 = 5
backThrad1: count1 = 5
backThrad2: count2 = 6
backThrad1: count1 = 6
backThrad2: count2 = 7
backThrad1: count1 = 7
backThrad1: count1 = 8
backThrad2: count2 = 8
backThrad1: count1 = 9
backThrad2: count2 = 9
main: count = 20
main End
可以看出使用join后主线程等待backThrad2和backThrad2结束后才拿到了最后结果的和,这中间是阻塞的。
如果注释掉join,我们可以看到如下打印结果:
> Task :Async2Sync.main()
backThrad1: count1 = 0
backThrad2: count2 = 0
backThrad2: count2 = 1
backThrad1: count1 = 1
main: count = 4
main End
backThrad2: count2 = 2
backThrad1: count1 = 2
backThrad1: count1 = 3
backThrad2: count2 = 3
backThrad1: count1 = 4
backThrad2: count2 = 4
backThrad2: count2 = 5
backThrad1: count1 = 5
backThrad2: count2 = 6
backThrad1: count1 = 6
backThrad2: count2 = 7
backThrad1: count1 = 7
backThrad1: count1 = 8
backThrad2: count2 = 8
backThrad1: count1 = 9
backThrad2: count2 = 9
可以看出,在没有join的情况下,主线程直接往下执行了,没有进行阻塞等待其他线程