Программа зависает, если поток создан в статическом блоке инициализатора
Я сталкивался с ситуацией, когда моя программа зависает, выглядит как тупик. Но я попытался выяснить это с помощью jconsole и visualvm, но они не обнаружили тупиков. Образец кода:
public class StaticInitializer {
private static int state = 10;
static {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
state = 11;
System.out.println("Exit Thread");
}
});
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("exiting static block");
}
public static void main(String...strings) {
System.out.println(state);
}
}
Когда я выполняю это в режиме отладки, я вижу, что управление достигает @Override public void run () {state = 11;
но как только состояние = 11 выполняется, оно просто зависает / блокируется. Я просматривал различные сообщения в stackoverflow и думал, что статические инициализаторы поточно-ориентированы, но в этом случае jconsole должна сообщить об этом. Что касается основного потока, jconsole говорит, что он находится в состоянии ожидания, и это нормально. Но для потока, созданного в статическом блоке инициализатора, jconsole говорит, что он находится в состоянии RUNNABLE и не заблокирован. Я в замешательстве и здесь не хватает какой-то концепции. Пожалуйста, помогите мне.