【问题标题】:java static block does not run in threadjava静态块不在线程中运行
【发布时间】:2015-07-21 11:14:24
【问题描述】:

我正在使用static 块在我的名为App1 的Java 应用程序中加载properties file

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

    }
}

在创建App1jar 之后,我在App2 中使用它,我使用线程(Executors.newFixedThreadPool(10)) 通过调用ConnWrapper 类的方法来运行App1(参见下面的流程)。但是我的静态块似乎只运行一次,即使我的App1 完成,JVM 是否也会保持类的加载?

App1的课堂流程

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

【问题讨论】:

  • 静态块保证在JVM加载类时只运行一次。你的问题和期望不清楚,你想达到什么目标?

标签: java multithreading static


【解决方案1】:

每个 jvm 的每个 Classloader 加载一次静态块。您的变量 '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");

    }
}

【讨论】:

  • 嗨@ramp,我需要在运行时更改属性文件。在我写完代码后,我看到属性文件发生了变化,但结果并没有显示出来。我将删除静态块和变量,并改用构造函数。
  • 不,应用程序属性通常是静态数据。如果属性文件更改,您必须重新加载它。请参阅我的帖子上的编辑,
【解决方案2】:

这是静态块,根据 java 规范,它只加载一次,所以多少次 我们调用该方法会得到相同的结果,因此这里不需要线程概念

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2014-01-09
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2011-09-05
    • 2012-06-21
    相关资源
    最近更新 更多