我开始研究寻找sun.misc.Signal类的替代方案,因为它可能在即将到来的JDK中不受支持(我们目前正在研究1.6)。当我构建这个项目时,我得到:
警告: sun.misc.SignalHandler是Sun专有的API,可能会在以后的版本中删除。
我遇到了多种解决方案,但它们不适合我的项目,例如在这个问题中。
在我的情况下,这是不可接受的,因为:
因此,理想的解决方案是找到类似这个类的新Oracle版本或以同样方式工作的东西。有这样的解决办法吗?
发布于 2019-06-06 21:03:50
如果您不能接受sun.misc.Signal在最近的将来可能会改变的任何可能性,那么就用一种编译成机器代码(如C)并使用System.load导入库的语言,用JNI接口实现信号处理。使用JNI,java可以使用C,C可以使用java。第一次使用JNI时,我发现在我的C程序中使用整个java的能力很有趣。
现在,您唯一需要担心的是,操作系统界面是否会改变,或者更有可能的是,在使用中的操作系统的选择会发生变化。
发布于 2021-06-05 18:07:27
这种解决办法确实存在。JNR ( https://github.com/jnr/ )是一个有效的POSIX层;与JNI+JNA (我这里读的是:https://www.slideshare.net/skrb/jnr-java-native-runtime )比较。
这是我使用JNR在Java中处理SIGHUP的代码:
SignalHandler handler = new SignalHandler()
{
@Override public void handle(int signal) { reloadThings(); }
};
final POSIX posix = POSIXFactory.getPOSIX(new DefaultPOSIXHandler(), true);
posix.signal(Signal.SIGHUP, handler);SignalHandler代码是要做的,posix句柄是JNR入口点AFAIK,然后最后一行注册信号。
JNR似乎正在积极开发(截至2021年),而且规模不太大。在我看来不错-因为这个我才开始使用它。PS:我刚刚检查了这个,以便与SIGINT = Ctrl+C一起工作。
发布于 2014-04-15 18:25:37
你最好的选择是远离信号,因为它们没有得到很好的支持。
IPC的替代方案:
https://stackoverflow.com/questions/19711062
复制相似问题