Возврат / Остановка выполнения функции при нажатии клавиши в 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 не моя собственная работа)