Windows:发信号通知Java进程以显示其窗口

时间:2011-06-08 16:43:28

标签: java desktop-application background-process launcher

我有一个在后台运行的Java进程。如何快速通知过程显示其窗口?我想要一个非常轻量级的脚本,可以从开始菜单启动它。

我想可能是一个BAT文件,用于检查锁定文件是否在过去几秒内被触摸,向进程发出信号,否则,创建一个新文件。信号可以是通过创建进程将要侦听的另一个文件。

这有效,但似乎效率低下。犹豫不决是不可避免的。

我可以使用Java代替BAT文件,但仍然存在如何发出后台进程信号的问题。这只需要在Windows中工作,但我对Java很好,所以我正在使用它。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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等价物适用于任何文件描述符。

不要简单地在我上面提到的线程中轮询文件,而是让操作系统做到这一点!将文件传递到writefds设置为select,然后在文件被修改时返回。这意味着您的进程不会花费宝贵的CPU时间来等待文件的更改。

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

再次编辑:

发现它! Java的Selector类看起来像是实现了select。遗憾的是,FileChannel不可选,在这种情况下可能需要。 :(