0

我有一个在后台运行的 Java 进程。如何快速向进程发出信号以显示其窗口?我想要一个真正轻量级的脚本,它可以做到这一点,并且可以从“开始”菜单启动。

我想可能是一个 BAT 文件,它检查锁定文件是否在最后几秒钟内被触摸,发出进程信号,否则,创建一个新文件。信号可能是通过创建另一个进程将监听的文件。

这行得通,但似乎效率低下。犹豫听起来是不可避免的。

我可以使用 Java 代替 BAT 文件,但仍然存在如何向后台进程发出信号的问题。这只能在 Windows 中工作,但我擅长 Java,所以这就是我正在使用的。

有任何想法吗?

4

2 回答 2

3

一种选择是让该进程在端口(例如 8888)上具有侦听器,然后您可以向该端口发送消息(或执行类似 telnet localhost 8888 的操作)。正在运行的进程可以有一个单独的线程在该端口上侦听。

另一种选择是使用 JMX 与 JVM 通信 - 请参阅 http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html

于 2011-06-08T16:53:06.270 回答
1

是否有任何东西阻止您从 Java 进程中检查锁定文件?您可以使用观察者模式来提醒主线程(或哪个线程)注意文件中的更改。

例如:


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 等效项适用于任何文件描述符。

与其简单地在我上面提到的线程中轮询文件,不如让操作系统来做!将文件传递到writefds集合中select,然后在修改文件时返回。这意味着您的进程不会花费宝贵的 CPU 时间来等待对文件的更改。

我还没有验证 Java 是否在 JDK 中公开了这个调用,所以它可能需要编写一个 JNI 接口才能让它工作。我在这方面的知识有点模糊,对不起。

再次编辑:

找到了!Java 的 Selector 类看起来像是实现了select. 不幸的是,FileChannel 是不可选择的,这在这种情况下可能是必需的。:(

于 2011-06-08T17:07:54.163 回答