2016-05-27 4 views
3

Этот класс не инициализирует себя обычным способом, поэтому он вызывает помощь фонового потока.Потоки Java ведут себя differnetly

Насколько я понимаю, программа должна печатать правду?

Но если вы запустили программу, вы обнаружили, что она ничего не печатает; это просто зависает.

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); 
} 

}

Может кто-то пожалуйста, объясните, почему это происходит.

ответ

4

«Статический инициализатор для класса запускается при первом доступе к классу, либо для создания экземпляра, либо для доступа к статическому методу или полю». Static Initialization Blocks

Я предполагаю, что для запуска этой программы необходимо сначала инициализировать тест класса. И поэтому он сначала пытается выполнить статический блок, но этот блок никогда не выходит (поскольку он не может установить статический член isInitialized, поскольку он еще не готов). Таким образом, тестовый класс никогда не полностью инициализирован, поэтому основной метод даже не запускается.

Решение для вас может привести к тому, что команда ожидания окончания потока инициализации будет выполнена до основного метода. Поэтому он не блокирует тестирование класса 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); 
    } 
} 
+0

Похоже на тупик – erkfel

Смежные вопросы