2015-07-21 3 views
-1

Я использую static блок для загрузки properties file в моем Java приложение под названием App1Java статический блок не работает в потоке

public class Configuration{ 
static { 
    System.out.println("static "); 
    PropertyConfigurator.configure("./TwitterLog4j.properties"); 
    log = Logger.getLogger(Configuration.class.getName()); 
    configProp = new Properties(); 

    try { 

     configProp.load(Configuration.class.getClassLoader().getResourceAsStream("TwitterConfig.properties")); 

    } catch (IOException e) { 
     throw new RuntimeException("TC100: Unable to load the connector configuration file. Configuration file is missing or is invalid."); 
    } 

    CONSUMER_KEY = configProp.getProperty("APPKEY"); 
    CONSUMER_SECRET = configProp.getProperty("APPSECRET"); 

    } 
} 

После создания jar из App1, я использую его в App2, где я использую резьб (Executors.newFixedThreadPool(10)) для запуска App1 путем вызова метода класса ConnWrapper (см. ниже). Но мой статический блок, кажется, работает только один раз, поддерживает ли JVM классы, даже когда мой App1 заканчивается?

класса Поток App1

ConnWrapper Class --> Conn Class --> ConnInterface Class --> Configuration Class 
*(--> = calls method of) 
+1

Статические блоки гарантированно работают только один раз, когда класс загружается JVM. Ваш вопрос и ожидание неясны, чего вы хотите достичь? – hagrawal

ответ

0

Это статический блок в соответствии с ява нормы его загружены только один раз, так как много раз мы называя этот метод дает нам тот же результат, так потоковая понятие не нужно здесь

1

Статический блок загружается один раз в Classloader за jvm. Ваша переменная 'configProp' является статической переменной класса, который вы можете использовать для доступа к свойствам, поэтому зачем вам загружать ее несколько раз?

public class Configuration{ 

public static Properties configProp; 

static{ 
    reloadProperties(); 
} 

public static void reloadProperties() 
{ 
    System.out.println("static "); 
    PropertyConfigurator.configure("./TwitterLog4j.properties"); 
    log = Logger.getLogger(Configuration.class.getName()); 
    configProp = new Properties(); 

    try { 

     configProp.load(Configuration.class.getClassLoader().getResourceAsStream("TwitterConfig.properties")); 

    } catch (IOException e) { 
     throw new RuntimeException("TC100: Unable to load the connector configuration file. Configuration file is missing or is invalid."); 
    } 

    CONSUMER_KEY = configProp.getProperty("APPKEY"); 
    CONSUMER_SECRET = configProp.getProperty("APPSECRET"); 

    } 
} 
+0

hi @ramp, мне нужно изменить файл свойств во время выполнения. После того, как я написал код, я увидел, что файл свойств изменился, но результаты его не показали. Я удалю статический блок и переменные и вместо этого использую конструктор. –

+0

Нет, свойства приложения обычно являются статическими данными. Вы должны просто перезагрузить его, если файл свойств изменится. См. Редактирование на моем посту, – ramp

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