此类不会以通常的方式初始化自身,因此它会在后台线程的帮助下调用。
根据我的理解,该程序必须打印真实吗?
但如果您运行该程序,您会发现它什么都没打印;它只是挂起。
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);
}
}
有人可以解释为什么会发生这种情况。
答案 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);
}
}