【问题标题】:How to printout a single line at time according to a schedule from an ArrayList?如何根据 ArrayList 中的时间表一次打印出一行?
【发布时间】:2017-09-04 11:08:24
【问题描述】:

我正在尝试创建一种方法,该方法一次打印出一行,之间有两分钟的延迟。我怎么做?。

这部分代码读取一个文本文件(questionsFile)并创建一个ArrayList:

public Broadcaster(Socket connection) throws IOException {

    read = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    write = new PrintStream(connection.getOutputStream());  

    List<String> questionsList = new ArrayList<>();
    try (Stream<String> questionsStream = Files.lines(Paths.get(questionsFile))) {
        questionsList = questionsStream
                .parallel()
                .collect(Collectors.toList());

    } catch (IOException w) {
        w.printStackTrace();
    }

下面有一个计时器,但由于某种原因,我无法让它工作。整个 ArrayList 被打印出来,没有任何延迟。我的意图是使用 printStream 但出于测试目的,文本当前打印到控制台。如何重写代码以便一次打印一行?

    List<String> finalQuestionsList = questionsList; 
    timer.schedule(task(() -> finalQuestionsList.forEach(System.out::println))
            , 120, TimeUnit.SECONDS.toMillis(1));
}

private TimerTask task(Runnable task) {
    return new TimerTask() {
        @Override
        public void run() {
            task.run();

【问题讨论】:

  • 你有没有调用 timer.start()?计时器设置为重复吗?
  • 不是直接的,但我正在使用 ExecutorService 启动该方法,它可以让一切运行。

标签: java arraylist java-8 scheduled-tasks java-threads


【解决方案1】:

简单的解决方案是:

for (String question : questionsList) {
    timer.schedule(task(() -> System.out.println(question)), 0);
    try {
        sleep(2000);
    } catch (Exception ignored) {}
}

【讨论】:

  • 感谢您的帮助!
  • 当然,当这个循环通过sleep 阻塞线程时,使用Timer 是荒谬的。有了这段代码,计时器就完全过时了。这段代码甚至在最后一个元素被打印后等待两秒钟……
  • 你是对的。我想尽可能接近问题的原始代码。并且还写了“微不足道的解决方案:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多