Будущее Java: проблема при попытке понять метод.get()

import java.io.*;
import java.util.concurrent.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Callable;
class _TimeOut_ extends PrintIn_Delays {
  public static void main(String[] args)
      throws InterruptedException {
    TimeWait Timeout = new TimeWait();
    String input = Timeout.readLine();
    String input2 = Timeout.readLine();
  }
}
class Reader implements Callable<String>  {
  public String call() throws IOException {
    BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in));
    String input;
    do {
      input = br.readLine();
    }while ("".equals(input));
    return input;
  }
}
class TimeWait extends _TimeOut_ {

  public String readLine() throws InterruptedException {
    ExecutorService ex = Executors.newSingleThreadExecutor();
    String input = null;
    try {        
        try {
            Future<String> result = ex.submit(
            new Reader());
            input = result.get(5, TimeUnit.SECONDS);
        } catch (ExecutionException e) {
          e.getCause().printStackTrace();
        } catch (TimeoutException e){}
    } finally {
      ex.shutdownNow();
    }
    System.out.println(" "+input);
    return input;
  }
}

Это будет ждать 5 секунд для пользовательского ввода. Если пользователь ничего не вводит, отображается ноль. Теперь проблема в том, что: когда я его запускаю, он ждет ввода в течение 5 секунд, но я ничего не ввожу, поэтому вывод равен нулю. Затем во втором входе я ввожу "привет". Но он все еще ждет в течение 5 секунд (что не должно), и после ввода, он все еще отображает ноль. Вот вывод:

null 
hi
null

1 ответ

Проблема в том, что даже если вы перестаете ждать, пока первое Future получит значение, оно не остановится в ожидании значения. BufferedReader.readLine() Вызовите просто блоки, ожидая ввода или закрывая входной поток, независимо от времени ожидания.

Итак, когда вы в конечном итоге вводите значение, первый поток получает его; тогда нечего читать второй ветке.

(Но, конечно, второй поток не перестал ждать: он будет продолжать ждать ввода или закрытия входного потока).

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