java - 这个程序发生了什么,更重要的是,为什么?

标签 java multithreading concurrency

请帮助我理解该程序的执行以及从更广泛的意义上讲,这里应用了哪些概念?解释线程/堆栈创建和销毁的插图会很有帮助。

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()));
    }
}

最佳答案

  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 关闭,因为所有线程都已死亡。

关于java - 这个程序发生了什么,更重要的是,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3670349/

相关文章:

java - Gradle 3.3 和最新的构建工具

java - 可比接口(interface)取决于大小?

java - 如何报告输入是否已使用 OWASP Java HTML Sanitizer 进行清理

JavaFX ChangeListener 并不总是有效

concurrency - 为什么这段 Go 代码会死锁?

java - 如何批量删除hbase中的多行?

c++ - 在多个自动重置事件上使用 WaitForMultipleObjects

c++ - 静态成员的两个实例,怎么可能?

multithreading - 用于有向图中循环检测的多线程算法

c# - 是否可以在后台线程上创建一个对象而不在主线程上引用?