这个计划发生了什么,更重要的是,为什么?

use*_*526 0 java concurrency multithreading

请帮助我理解这个程序的执行情况以及更广泛意义上适用的概念?解释线程/堆栈创建和销毁的说明将是有帮助的.

class Joining {

    static Thread createThread(final int i, final Thread t1) {
        Thread t2 = new Thread() {
            public void run() {
                System.out.println(i+1);
                try {
                    t1.join(); 
                } catch (InterruptedException ie) {
                }
                System.out.println(i+2);
            }
        };
        System.out.println(i+3);
        t2.start(); //1
        System.out.println(i+4);
        return t2;
    }
    public static void main(String[] args) {
        createThread(10, createThread(20, Thread.currentThread()));
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*son 5

  1. 内部createThread调用在主线程[M]的底部调用,带有参数20和当前线程.
  2. 这个电话打印23.
  3. 启动(并将返回)新线程[A],其打印21,并等待主线程[M]死亡(并且在它之后将打印22).
  4. 此调用打印24.在新线程[A]打印21之前,无法确定是否会发生这种情况.
  5. 此调用返回新线程[A],它正在等待主线程[M]死亡.
  6. 新线程[A]作为第二个参数传递给createThread调用,其中10作为第一个参数.
  7. 这个电话打印13.
  8. 另一个新线程[B]被启动(并且将返回但是没有人正在捕获此返回),其打印11,并等待第一个创建的线程[A]死亡(并且将在它之后打印12).
  9. 此调用打印14.在第二个新线程[B]打印11之前,无法确定是否会发生这种情况.
  10. 这个调用返回第二个新线程[B],它正在等待第一个创建的线程[A]死掉,但是这个返回调用没有做任何事情.
  11. 主线程[M]用完了要做的事情并且死了.
  12. 当主线程[M]死掉时,第一个创建的线程[A]上的join()调用返回.
  13. 第一个创建的线程[A]打印22.
  14. 第一个创建的线程[A]死掉.
  15. 当第一个创建的线程[A]死亡时,第二个创建的线程[B]上的join()调用返回.
  16. 第二个创建的线程[B]打印12.
  17. 第二个创建的线程[B]死掉.
  18. JVM关闭,因为所有线程都已死亡.