这个类没有以通常的方式初始化自己,所以它在后台线程的帮助下调用。
根据我的理解,程序肯定必须打印 true 吗?
但是如果你运行这个程序,你会发现它没有打印任何东西;它只是挂起。
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);
}
谁能解释一下为什么会这样。
“类的静态初始值设定项在首次访问类时运行,要么创建实例,要么访问静态方法或字段。” Static Initialization Blocks
我猜这个程序要启动需要先初始化类Test。因此它首先尝试执行静态 block ,但该 block 永远不会退出(因为它无法设置静态成员 isInitialized,因为它尚未准备好)。
所以测试类从未完全初始化,因此 main 方法甚至没有开始执行。
您的解决方案可能是将等待初始化线程完成的指令移至 main 方法。所以它不会阻止测试类被完全初始化。
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);
}
}