Отмена функции BufferedReader's readLine () - PullRequest
0 голосов
/ 15 февраля 2019

Я написал бесконечный цикл, в котором я хочу отправлять сообщение пользователя каждые 5 секунд.Поэтому я написал поток, который ждет 5 секунд, а затем отправляет сообщение, полученное методом readLine ().Если пользователь не дает никакого ввода, цикл не продолжается из-за метода readLine (), ожидающего ввода.Так как я могу отменить метод readLine ()?

while (true) {
        new Thread() {
            @Override
            public void run() {
                try {
                    long startTime = System.currentTimeMillis();
                    while ((System.currentTimeMillis() - startTime) < 5000) {
                    }
                    toClient.println(serverMessage);
                    clientMessage = fromClient.readLine();

                    System.out.println(clientName + ": " + clientMessage);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        serverMessage = input.readLine();
    }

1 Ответ

0 голосов
/ 15 февраля 2019

Это похоже на проблему типа производитель-потребитель, и я бы структурировал ее совершенно иначе, поскольку fromClient.readLine(); блокирует и, следовательно, должен выполняться в другом потоке.

Так что рассмотрите возможность чтения ввода пользователя в другомвставьте в структуру данных Queue<String>, например LinkedBlockingQueue<String>, и затем извлекайте элементы String из очереди в коде выше каждые 5 секунд, или ничего, если в очереди нет элементов.

Что-то вроде ....

new Thread(() -> {
    while (true) {
        try {
            blockingQueue.put(input.readLine());
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }
    }
}).start();

 new Thread(() -> {
    try {
        while (true) {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String input = blockingQueue.poll();
            input = input == null ? "" : input;
            toClient.println(input);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}).start();

Примечания: не вызывайте .stop() в потоке, так как это опасно.Также избегайте расширения темы.

...