Программа зависает, если поток создан в статическом блоке инициализатора

Я сталкивался с ситуацией, когда моя программа зависает, выглядит как тупик. Но я попытался выяснить это с помощью 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 и не заблокирован. Я в замешательстве и здесь не хватает какой-то концепции. Пожалуйста, помогите мне.

Ответы на вопрос(1)

Ваш ответ на вопрос