我想实现不停止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值,请问这个该怎么实现?
望高手,多多指教。谢谢!!
譬如 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值,请问这个该怎么实现?
望高手,多多指教。谢谢!!
解决方案 »
- java swing JScrollPane
- 基于C/S的上传
- 关于Java写的QQ客户端
- 关于String类
- Jakarta Regexp 谁有这个包啊|?我去APACHe的网站上根本看下不到!
- Java窗口
- 怎么把一个非static变量的值赋给static变量,在线等!
- 点击按钮,切换到下一个窗口用什么语句啊?类似于WINDOWS中的虚线框用哪个控件啊?
- 当insert into tb1 values(1,2,3) select * from tb1 两语句一起执行时,如何取得更新数量和结果集?
- WhokShop3.0.2 支持GUI设计吗? AS/400 支持JDK2吗?
- toArray()功能的实现
- java 学习路径--书籍篇
这里死循环 CPU 就挂了
建议你在每次使用的时候去读配置文件或者写个进程去监听该文件,如果发现文件被修改了,就加载一下(使用java Timer)
建议楼主学习一下spring,简单易用。
答:当然可以了.问题的核心是:A.java与B.java必须要运行在同一个JVM空间中.
方法很多.
如:
1)若你是GUI程序,则当配置文件修改过后,单击一个"重新装载"按钮,调用B.java中代码.
2)若不是GUI,若是命令行,则可运行一个线程,一直处于接受命令状态.当配置文件修改过后,从键盘上输入一个"重新装载"的命令,调用B.java中代码.
3)其它方法,如:TOMCAT的控制命令网络端口监听方法,监听你输入的"重新装载"命令,等等...很多方法的.
用定时器的不好之处是:如何判别是已更新的文件,还是老文件(文件修改时间判?还是其它...?),另外不能即时更新,要等一个定时器周期到,才能更新配置.若你不是要及时更新,定时器方法也行.
您刚才说的“你给读配置的程序起个线程”是什么意思?能举个例子吗?谢谢!!!
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赋值
}
}
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赋值
}
}