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" );

... コマンド プロンプトからアプリを実行すると、次のような効果が得られます:

明らかに信号がコードによってトラップされているため、元の while ループが終了しない理由がわかりません。助けていただければ幸いです。たぶん、私は明らかな何かを見落としました。

前もって感謝します。

4

1 に答える 1

1

スレッド間の通信に使用しようとしていますが、コンパイラにそのことを伝えていないため、一度だけチェックすることでループをinterrupted「簡素化」しています。while作るinterrupted volatile

于 2013-08-26T18:56:46.847 に答える