1

プログラムに、キーを押すと停止したい特定の機能があります。そのためにネイティブキーボードフックを設定しました。現在、そのキーが検出されたときに System.exit(0) を呼び出します。ただし、プログラムを終了したくはありません。その操作を停止して、呼び出された場所に戻るだけです。以下に例を示します。

public class Main {
    public static void main(String[] args) {
        System.out.println("Calling function that can be stopped with CTRL+C");
        foo(); // Should return when CTRL+C is pressed
        System.out.println("Function has returned");
    }
}

foo() の呼び出しをスレッドに入れて呼び出すことができるようにしましたThread.interrupt()が、関数呼び出しを非ブロックではなくブロックにしたいです。また、ブロッキング IO 呼び出しがあるため、例外を処理する必要があり、以前に問題が発生しfoo()たため、必要でない限り割り込みを処理したくありません。ClosedByInterruptException

また、 の本体foo()は非常に長く、内部に多くの関数呼び出しが含まれているためif (stop == true) return;、関数に書き込むことはできません。

ブロッキングスレッドを作成するよりも良い方法はありますか? もしそうなら、どのように?そうでない場合、ブロック スレッドを作成するにはどうすればよいですか?

4

1 に答える 1

1

これはどう?

// Create and start the thread
MyThread thread = new MyThread();
thread.start();

while (true) {
    // Do work

    // Pause the thread
    synchronized (thread) {
        thread.pleaseWait = true;
    }

    // Do work

    // Resume the thread
    synchronized (thread) {
        thread.pleaseWait = false;
        thread.notify();
    }

    // Do work
}

class MyThread extends Thread {
    boolean pleaseWait = false;

    // This method is called when the thread runs
    public void run() {
        while (true) {
            // Do work

            // Check if should wait
            synchronized (this) {
                while (pleaseWait) {
                    try {
                        wait();
                    } catch (Exception e) {
                    }
                }
            }

            // Do work
        }
    }
}

( http://www.exampledepot.com/egs/java.lang/PauseThread.htmlから取得したもので、自分の作品ではありません)

于 2012-05-09T20:11:22.800 に答える