java线程中join方法遇到的问题

在学习java多线程时发现一个问题, 当创建多个线程时 (其中一个线程采用匿名内部类创建线程 thread2), 在调用join() 方法后, 主线程在thread2 之前执行完毕. 但是当thread2 内部run方法内部有调用sleep 方法时, 主线程才会在thread2 之后输出.
正常不应该是主线程会在join() 的线程执行完之后再执行吗? 麻烦各位帮忙看下~ 多谢~

public class TestDemo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new MyThread();
        myThread.start();
        Thread myThread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.err.println("分支线程2:"+i);
                }
//                try {
//                    Thread.sleep(3000);
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
//                System.err.println("分支线程3执行完毕");
            }
        });
        myThread.join();
        myThread2.start();
        myThread2.join();
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程:"+i);
        }
    }
}
class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("分支线程111:"+i);
        }
    }
}

在 Java 中,join() 方法的作用是等待该线程执行完毕,主线程需要等到该线程执行完毕后才能继续执行。

可以发现,当匿名内部类的线程 myThread2 的 run() 方法不含有 sleep() 方法时,主线程会在 myThread2 执行完之前继续执行。这是因为,如果该线程的执行时间较短,主线程在等待完成时间不足一个时间片,就可以在该线程执行完前继续执行。因此,使用 join() 的目的并不是强制主线程等待子线程完成,而是请求主线程等待该线程的完成。

而当 myThread2 的 run() 方法含有 sleep() 方法时,主线程会在该线程睡眠结束后才继续执行,这是因为 sleep() 方法将线程设置为不可运行状态,在指定的时间内该线程不再占用 CPU 资源。