以前在学Thread的时候,就只知道Runnable是运行体,然后通过start方法来运行,也可以通过isAlive来检测是否在运行。
这些基础的用法在大部分时候还是够用的,不过后面也逐渐接触到ThreadPoolExecutor来管理线程,也开始使用join等方法来进行线程同步。
这里就简单记录一下我学习到的join方法。

join()

基础的join方法,不带参数。
效果是让当前线程在执行到join时,在目标线程结束前阻塞。只有目标线程结束后,当前线程才会进行继续执行。
例如:

1
2
3
4
5
6
7
8
9
10
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (Exception ignored) {
}
System.out.println("Hello World!");
});
thread.start();
thread.join();
System.out.println("OK!");

这里的join方法会让程序进行到此处时,等待thread线程结束,然后才会继续执行。
所以控制台会输出以下结果:

1
2
Hello World!
OK!

当我们把thread.join();去掉后,由于thread线程中,会等待一秒才会输出,所以结果会变成:

1
2
OK!
Hello World!

并且若在此时,我们在start前加上thread.setDaemon(true);,则只会输出OK!

join(long)与join(long, int)

与join方法类似,这里的参数表示了一个持续时间,用于控制等待的最长时间。
当目标线程执行的时间超过这个参数时,当前线程就不会再等待了,而是继续执行下面的代码。

例如:

1
2
3
4
5
6
7
8
9
10
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (Exception ignored) {
}
System.out.println("Hello World!");
});
thread.start();
thread.join(500);
System.out.println("OK!");

这里我们等待thread线程500毫秒,但是很明显,thread线程需要至少1000毫秒才会结束,所以获得到如下输出:

1
2
OK!
Hello World!

总结

join方法一般适用于对多个线程进行数据同步,需要等待所有的线程都获取完数据后,才能进行下一步操作。


本站总访问量