我想实现不停止java应用程序,来读取配置文件的更改。 
譬如 A.java : 
        static int av = 0; 
public static void readConfig(){…… av = getValue("a"); ……} 
        public static void main(String[] args){ 
                readConfig(); 
                while(true){…… 打印av ……} 
        } 
B.java: 
        public static void main(String[] args){ 
                readConfig(); 
        } 
我的想法是:当配置文件中的a值改变后,我们就运行一下B.java重新给av赋值, 使A.java打印的a是新修改的值。 
但我通过上面的两个类实现不了,A.java 还是打印以前的av值,请问这个该怎么实现? 
望高手,多多指教。谢谢!! 
      

解决方案 »

  1.   

      while(true){…… 打印av ……} 
    这里死循环 CPU 就挂了
    建议你在每次使用的时候去读配置文件或者写个进程去监听该文件,如果发现文件被修改了,就加载一下(使用java Timer)
      

  2.   

    动态注入
    建议楼主学习一下spring,简单易用。
      

  3.   


    答:当然可以了.问题的核心是:A.java与B.java必须要运行在同一个JVM空间中.
    方法很多.
    如:
    1)若你是GUI程序,则当配置文件修改过后,单击一个"重新装载"按钮,调用B.java中代码.
    2)若不是GUI,若是命令行,则可运行一个线程,一直处于接受命令状态.当配置文件修改过后,从键盘上输入一个"重新装载"的命令,调用B.java中代码.
    3)其它方法,如:TOMCAT的控制命令网络端口监听方法,监听你输入的"重新装载"命令,等等...很多方法的.
    用定时器的不好之处是:如何判别是已更新的文件,还是老文件(文件修改时间判?还是其它...?),另外不能即时更新,要等一个定时器周期到,才能更新配置.若你不是要及时更新,定时器方法也行.
      

  4.   

     你要用while(true)那种也可以..你给读配置的程序起个线程,但是你也得加个sleep意思下吧..不然资源都被空循环占完了...
      

  5.   

    很多容器和IDE都有相关配置的功能如果用代码的话 应该是用监听器吧 
      

  6.   

    shadowlin :是的,我是需要sleep的。
    您刚才说的“你给读配置的程序起个线程”是什么意思?能举个例子吗?谢谢!!!
      

  7.   

    答:参考代码:(程序运行时,任何时刻,输入一个"reload"命令(表示配置文件已修改,重新装入新值)),AV的值都从值1修改成3import java.io.*;public class A {public static int av=1;
     static void readConfig()
     {
    //读配置的代码 
     }
     
     static class ReadCommand extends Thread
     {
    /* (non-Javadoc)
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
    try {
    myRun();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public void myRun() throws Exception {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String comm=null;
    System.out.print("控制台>");
    while((comm=br.readLine())!=null)
    {
    if(comm.trim().equals("reload"))
    {//reload命令,调用B.java进行处理
    B.loadConfig();
    }

    System.out.print("控制台>");
    }
    }
     
     }
    public static void main(String[] args) {
     
    readConfig(); 
    new ReadCommand().start();//启动命令控制的线程
            while(true){
             System.out.println("当前av= "+av);
             try {
    Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {

    }
            }  }}
    public class B {
     public static void loadConfig()
     {
     A.av=3;//模拟配置文件,对A中变量av赋值
     }
    }
      

  8.   

    答:参考代码:(程序运行时,任何时刻,输入一个"reload"命令(表示配置文件已修改,重新装入新值)),AV的值都从值1修改成3import java.io.*;public class A {public static int av=1;
     static void readConfig()
     {
    //读配置的代码 
     }
     
     static class ReadCommand extends Thread
     {
    /* (non-Javadoc)
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
    try {
    myRun();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public void myRun() throws Exception {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String comm=null;
    System.out.print("控制台>");
    while((comm=br.readLine())!=null)
    {
    if(comm.trim().equals("reload"))
    {//reload命令,调用B.java进行处理
    B.loadConfig();
    }

    System.out.print("控制台>");
    }
    }
     
     }
    public static void main(String[] args) {
     
    readConfig(); 
    new ReadCommand().start();//启动命令控制的线程
            while(true){
             System.out.println("当前av= "+av);
             try {
    Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {

    }
            }  }}public class B {
     public static void loadConfig()
     {
     A.av=3;//模拟配置文件,对A中变量av赋值
     }
    }
      

  9.   

    难道这个功能的实现和java有关吗?