Java Future:尝试理解.get()方法时出现的问题

时间:2018-06-20 06:46:39

标签: java futuretask

BATCH_INSTALL

这将等待5秒钟以供用户输入。如果用户未输入任何内容,则显示null。 现在的问题是: 当我运行它时,它等待5秒钟供我输入,但是我什么也没输入,所以输出为空。然后在第二个输入中,输入“ hi”。但是它仍然等待5秒钟(不应该这样),并且在输入之后,它仍显示为null。这是输出:

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;
  }
}

1 个答案:

答案 0 :(得分:0)

问题在于,即使您停止等待第一个Future获得值, it 也不会停止等待值。 BufferedReader.readLine()调用只是阻塞,等待输入或关闭输入流,而与超时无关。

因此,当您最终输入一个值时,第一个线程将其获取;那么第二个线程就什么也没有读取。

(但是,当然,第二个线程也没有停止等待:它将继续等待输入或输入流的关闭)。