join源码如下:

    1. public final synchronized void join(long millis)
    2. throws InterruptedException {
    3. long base = System.currentTimeMillis();
    4. long now = 0;
    5. if (millis < 0) {
    6. throw new IllegalArgumentException("timeout value is negative");
    7. }
    8. if (millis == 0) {
    9. while (isAlive()) {
    10. wait(0);
    11. }
    12. } else {
    13. while (isAlive()) {
    14. long delay = millis - now;
    15. if (delay <= 0) {
    16. break;
    17. }
    18. wait(delay);
    19. now = System.currentTimeMillis() - base;
    20. }
    21. }
    22. }

    应用了保护性暂停,如果是带参数的join方法,那么则等待一定时间后,调用join方法的线程得以继续执行,而不是非要等待线程执行完毕后,当前线程才继续执行。

    1. new thread(()->{
    2. t1.join(10);
    3. },"t2"),start;

    即线程t2要等待t1线程执行10秒后,线程t1和线程t2开始并行执行。