2012-02-18 37 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