2011-06-08 45 views
0

我有一個在後臺運行的Java進程。我怎樣才能快速指示過程顯示窗口?我想要一個真正輕量級的腳本,可以做到這一點,並可以從開始菜單啓動。Windows:指示Java進程顯示其窗口

我想也許是一個BAT文件,用於檢查鎖文件是否在最後幾秒鐘被觸摸,表示進程發出信號,否則創建一個新文件。該信號可以通過創建該進程將要監聽的另一個文件。

雖然有效,但它似乎效率低下。猶豫聽起來不可避免。

我可以使用Java而不是BAT文件,但仍然存在如何發出後臺進程信號的問題。這隻能在Windows中工作,但我對Java很好,所以這就是我正在使用的。

任何想法?

回答

3

一種選擇是讓該進程在端口上有一個監聽器(例如8888),然後可以向該端口發送消息(或執行諸如telnet localhost 8888之類的操作)。正在運行的進程可能有一個單獨的線程在該端口上偵聽。

另一種選擇是使用與JVM JMX通信 - 見

+0

如果沒有那麼多的要求,我會用JMX,看起來有點複雜,我會用監聽器的方法,不用端口8888,因爲我想防止衝突,可能是隨機的。這裏:http:// stackoverflow。com/questions/6345153/bat-if-statement-based-modify-date-of-file/6388780 – 2011-06-17 20:29:31

1

有什麼阻止您檢查您的Java進程鎖定文件?您可以使用Observer模式來警告主線程(或者哪個線程)在文件中的更改。

例如:

 

public class FileWatcher implements Observable { 

    private long lastModified; 
    private final File file; 

    public FileWatcher(File f) { 
    this.file = f; 
    this.lastModified = file.lastModified(); 

    Thread t = new Thread() { 
     public void run() { 
      while(!stopThread) { 
      if(lastModified < file.lastModified()) { 
       lastModified = file.lastModified(); 
       setChanged(); 
       notifyObservers(); 

      }  
      Thread.currentThread().sleep(5);  
      } 
     } 
    }; 

    t.start(); 
    } 
} 
 

免責聲明:沒有測試或驗證所有,但我敢肯定你的想法。

編輯:哎呀,忘了循環。

編輯:新的想法。

我有另一種想法。 (我知道你已經接受了一個答案,但我想把它扔到那裏)。是否有可能使用select函數?在我非常有限的MSDN文檔中,這只是在套接字的上下文中提到的。我知道Linux的等價物適用於任何文件描述符。

而不是簡單地輪詢我在上面提到的線程中的文件,讓操作系統做到這一點!將文件傳入設置爲selectwritefds,然後在文件被修改時返回。這意味着您的進程不會花費寶貴的CPU時間來等待文件的更改。

我還沒有驗證Java是否在JDK中公開這個調用,所以它可能需要編寫一個JNI接口才能使其工作。我在這方面的知識有點模糊,對不起。

再次編輯:

發現它! Java的Selector類看起來像它實現了select。不幸的是,FileChannel是不可選擇的,這在這種情況下可能是必需的。 :(

+0

我想避免週期性地敲擊文件。這是我已經提到的想法。 *「信號可以通過創建另一個文件來進行,這個文件很有效,但效率很低,猶豫不決。」*。在你上面的例子中,你正在檢查文件每秒200次。這聽起來像會減慢PC的速度,但它會消除猶豫:) – 2011-06-17 20:27:11

+0

這是一個很好的觀點,但觸發信號的是什麼?例如,如果您正在等待某人修改文件(並且您只是使用腳本進行輪詢),那麼您是否也遇到了同樣的問題? – Tom 2011-06-17 22:04:31

+0

另外,我有另一個瘋狂的想法 - 如果你好奇,看第二編輯。 :) – Tom 2011-06-17 22:11:00