我正在编写一个可能会运行数天的控制台应用程序。可以这么说,为了给我的电脑一些停机时间,我需要应用程序是可中断的,但它只会在执行过程中在某些明确定义的点停止。
我决定使用信号处理程序来捕获 CTRL+C,但它的行为方式让我无法理解。
我想要的是这样的:
public static void main( String[] args )
{
class MySignalHandler implements SignalHandler
{
boolean interrupted = false;
public void handle( Signal signal )
{
interrupted = true;
}
}
MySignalHandler env = new MySignalHandler();
Signal.handle( new Signal( "INT" ), env );
while ( ! env.interrupted )
{
... Carry out a small and well-defined portion of the overall process ...
}
}
这不起作用(至少不是来自我的 Windows 命令提示符)。该应用程序永远不会终止。
但是,如果我将 while 循环更改为如下所示:
while (true)
if (env.interrupted)
System.out.print( "Y" );
else
System.out.print( "N" );
...并从命令提示符运行应用程序,我得到以下效果:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(现在我按 CTRL+C)YYYYYYYYYYYYYYYYYYYYYYYYYYYY
显然信号被代码捕获了,所以我不明白为什么原来的while循环不会终止。我将非常感谢一些帮助。也许我忽略了一些明显的东西。
提前致谢。