我正在编写一个可能会运行数天和数天的控制台应用程序。为了给我的计算机一些停机时间可以说,我需要应用程序是可中断的,但是这样它只会在执行期间停在某些明确定义的点上。
我决定使用信号处理程序来捕获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" );
...并从命令提示符运行应用程序,我得到以下效果: 新的NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
显然,信号被代码捕获,所以我不明白为什么原始的while循环不会终止。我非常感谢一些帮助。也许我忽略了一些显而易见的事情。
提前致谢。
答案 0 :(得分:1)
您尝试使用interrupted
在线程之间进行通信,但没有告诉编译器,因此只需检查一次就可以“简化”while
循环。制作interrupted
volatile
。