我有一个在后台运行的Java进程。如何快速向进程发出信号以显示其窗口?我想要一个非常轻量级的脚本,可以做到这一点,并且可以从"开始"菜单启动。
我认为可能是一个BAT文件,它检查锁定文件是否在最后几秒钟内被触摸,向进程发出信号,否则,创建一个新的。该信号可以通过创建进程将要侦听的另一个文件来实现。
这是有效的,但似乎效率低下。犹豫听起来是不可避免的。
我可以使用Java而不是BAT文件,但这仍然留下了如何向后台进程发出信号的问题。这只需要在Windows中工作,但我擅长Java,所以这就是我正在使用的。
有什么想法吗?
一种选择是让该进程在端口上有一个侦听器(例如8888),然后可以向该端口发送消息(或执行类似telnet localhost 8888的操作)。正在运行的进程可以有一个单独的线程在该端口上侦听
另一种选择是使用与JVM的JMX通信—请参阅http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html
是否有任何东西阻止您从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等价物适用于任何文件描述符。
与其简单地在我上面提到的线程中轮询文件,不如让操作系统来做!将文件传递到设置为select
的writefds
中,然后在修改文件时返回。这意味着您的进程不会花费宝贵的CPU时间等待对文件的更改。
我还没有验证Java是否在JDK中公开了这个调用,所以可能需要编写一个JNI接口才能使其工作。对不起,我在这方面的知识有点模糊。
再次编辑:
找到了!Java的Selector类看起来像是实现了select
。不幸的是,FileChannel是不可选择的,这在这种情况下可能是必需的。:(