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

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

но как только выполняется state = 11, он просто зависает / блокируется. Я просмотрел разные публикации в stackoverflow и подумал, что статические инициализаторы потокобезопасны, но в этом случае jconsole должна сообщить об этом. Что касается основного потока, jconsole сообщает, что он находится в состоянии ожидания, и это нормально. Но для потока, созданного в блоке статического инициализатора, jconsole сообщает, что он находится в состоянии RUNNABLE и не заблокирован. Я сбит с толку, и здесь не хватает какой-то концепции. Пожалуйста, помогите мне.

20
задан thomas 22 September 2011 в 16:08
поделиться