Прервать поток, ожидающий пользовательский ввод, а затем выйти из приложения.

У меня два потока работает,userInputThread ожидает ввода пользователя из командной строки иinterrupterThread пытается прерватьuserInputThread 1 сек после запуска. Очевидно, что вы не можете прервать поток, заблокированныйSystem.in, Другой ответ предлагает закрытьSystem.in с участиемSystem.in.close() прежде чем прерывать поток. Но когда я запускаю следующий код,userInputThread никогда не прерывается и приложение просто зависает без закрытия.

class InputInterruptionExample {

    private Thread userInputThread;
    private Thread interrupterThread;

    InputInterruptionExample() {
        this.userInputThread = new Thread(new UserInputThread());
        this.interrupterThread = new Thread(new InterrupterThread());
    }

    void startThreads() {
        this.userInputThread.start();
        this.interrupterThread.start();
    }
    private class UserInputThread implements Runnable {
        public void run() {
            try {
                System.out.println("enter your name: ");
                String userInput = (new BufferedReader(new InputStreamReader(System.in))).readLine();
            } catch (IOException e) {
                System.out.println("Oops..somethign went wrong.");
                System.exit(1);
            }
        }
    }
    private class InterrupterThread implements Runnable {
        public void run() {
            try {
                sleep(1000);
                System.out.println("about to interrupt UserInputThread");
                System.in.close();
                userInputThread.interrupt();
                userInputThread.join();
                System.out.println("Successfully interrupted");
            } catch (InterruptedException e) {
            } catch (IOException ex) {
                System.out.println("Oops..somethign went wrong.");
                System.exit(1);
            }
        }
    }
    public static void main(String[] args) {
        InputInterruptionExample exampleApp = new InputInterruptionExample();
        exampleApp.startThreads();
    }
}

Там уже похожийвопрос, но нет никаких определенных ответов.

Ответы на вопрос(2)

Ваш ответ на вопрос