Возврат / Остановка выполнения функции при нажатии клавиши в Java

У меня есть определенная функция в моей программе, которую я хочу остановить нажатием клавиши. У меня есть встроенный хук клавиатуры для этой цели. Прямо сейчас я вызываю 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; в функции это не вариант.

Есть ли лучший способ сделать это, чем создание блокирующего потока? Если так, то как? Если нет, как бы я сделал блокирующий поток?

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 не моя собственная работа)

Другие вопросы по тегам