2012-02-18 34 views
2

我有一个Java程序执行一些大型分析任务,在一个线程中运行一个循环(基本上是24/7)并访问许多其他线程来执行并行处理。我目前正在配置其他活动线程的数量,以便使用常量发送任务。在白天,我喜欢将其设置为较小的值(例如4),以使我的某些机器资源可用于交互式使用。隔夜(或其他时间,我离开我的机器无人看管)我希望程序使用更多的线程(比如8)。目前我正在停止程序,改变常量,重建和重新启动程序(我必须重新启动所有8个线程)。定期做这件事变得乏味。从正在运行的进程外部更改Java变量的值

我想建立一个简单的系统,从外部Java输入一个命令/脚本来改变程序的行为,以便它可以保持运行,但会根据我的输入改变空闲线程的数量。我已经搜索了答案,并知道这显然不可能与一个环境变量。我可以想到两种可能性:在文本文件中设置一个值并在循环的每个循环中读取它;并将值存储在我的程序与之交互的MySQL数据库中。

虽然这些解决方案对我很有用,但我有兴趣知道是否有任何其他(更标准的)方法让Java“配置变量”可以从运行过程的外部访问。

如果相关,我从Eclipse内运行进程。

编辑:只是想到了另外一个可能性:USR1和USR2信号...

回答

1

你要找的JMX:

http://docs.oracle.com/javase/tutorial/jmx/index.html
http://java.sun.com/developer/technicalArticles/J2SE/jmx.html(示例代码)

如果你不”如果你想全力以赴,你可以使用一个.properties文件,你的进程在启动时读取它的配置。让一个线程监视文件的变化,当它发生变化(因为你编辑了它),重新读取它并相应地改变程序的行为。 (Java 7内置了文件监视器,以前的版本必须自己编写代码,但可以在网上找到示例)

+0

是的,文件监控/读取是我已经倾向于的解决方案,但希望减少某些问题。 JMX看起来很整洁,但可能矫枉过正,这只是个人的便利。 – 2012-02-18 06:13:31

+0

Spring框架使得JMX在通过注释实现时相当简单,比如@ManagedResource – GreyBeardedGeek 2012-02-18 16:17:06

1

您可以添加一个始终等待特定端口连接的附加线程,并写入一个简单的程序发送消息到该端口上的程序(可能只是从本地主机)。收到此消息后,程序可以更改所需的任何设置。

+0

这就是...... JMX给你的东西,等等。 – 2012-02-18 06:06:21

+0

有趣的想法。主线程已经在8800端口上运行了一个web服务器进程,所以我可以玩解释这些请求。 – 2012-02-18 06:11:32

+1

“你为什么不把它列为我们的资产?!” - 公主新娘:) – 2012-02-18 06:13:22