Java线程的行为不同

时间:2016-05-27 05:20:28

标签: java multithreading

此类不会以通常的方式初始化自身,因此它会在后台线程的帮助下调用。

根据我的理解,该程序必须打印真实吗?

但如果您运行该程序,您会发现它什么都没打印;它只是挂起。

public class Test {
 private static boolean isInitialized = false;
  static {
    Thread t = new Thread(new Runnable() {
        public void run() {
            isInitialized = true;
        }
    });
    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
    }
}

public static void main(String[] args) {
    System.out.println(isInitialized);
}

}

有人可以解释为什么会发生这种情况。

1 个答案:

答案 0 :(得分:4)

“类的静态初始化程序在首次访问类时运行,要么创建实例,要么访问静态方法或字段。” Static Initialization Blocks

我想这个程序启动需要先初始化类Test。因此它首先尝试执行静态块,但该块永远不会退出(因为它不能设置静态成员isInitialized,因为它还没有准备好)。 因此Test类永远不会被完全初始化,因此主要方法甚至都没有开始执行。

您的解决方案可能是将等待初始化线程的指令移至主方法。因此它不会阻止Test类完全启动。

package com.company;

public class Test {
    private static boolean isInitialized = false;

    static Thread t = new Thread(new Runnable() {
        public void run() {
            isInitialized = true;
        }
    });
    static {
        t.start();
    }

    public static void main(String[] args) {
        try {
            t.join();
        } catch (InterruptedException ignored) { }

        System.out.println(isInitialized);
    }
}