0

我正在编写一个可能会运行数天的控制台应用程序。可以这么说,为了给我的电脑一些停机时间,我需要应用程序是可中断的,但它只会在执行过程中在某些明确定义的点停止。

我决定使用信号处理程序来捕获 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循环不会终止。我将非常感谢一些帮助。也许我忽略了一些明显的东西。

提前致谢。

4

1 回答 1

1

您正在尝试使用interrupted线程之间的通信但没有告诉编译器,因此它while通过仅检查一次来“简化”您的循环。使interrupted volatile.

于 2013-08-26T18:56:46.847 回答