可中断的Java控制台应用程序

时间:2013-08-26 18:41:37

标签: java console signals terminate

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

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

您尝试使用interrupted在线程之间进行通信,但没有告诉编译器,因此只需检查一次就可以“简化”while循环。制作interrupted volatile