【问题标题】:ScheduleAtFixedRate is not giving output using Future java 8ScheduleAtFixedRate 没有使用 Future java 8 提供输出
【发布时间】:2017-12-30 23:16:28
【问题描述】:

在下面的代码中scheduleAtFixedRate 无限运行。

所以问题是:

为什么java提供无限线程执行场景

Runnable task1 = () -> System.out.println("Hello Zoo");
Future<?> result = service1.scheduleAtFixedRate(task1, 8, 2, TimeUnit.SECONDS);
System.out.println(result.get());
System.out.println(result.isDone());

程序从不打印应该为 null 的 result.get() 或应该为 0System.out.println(result.isDone()); 的输出。

所以我的意思是在调用 scheduleAtFixedRate 之后代码应该是无法访问的。

【问题讨论】:

  • “使用 scheduleAtFixedRate 后”是什么意思?您的代码中没有消耗任何内容。
  • @Holger 更新
  • 哪个代码应该无法访问?为什么?
  • 代码可达的。当您在Future 上调用get() 时,它会等待很长时间,但线程可能会被中断或有人可能会取消Future,因此,代码仍然不会永远被阻塞,只有你谁决定永远不中断线程并且永远不取消未来,但是 Java 怎么能预测你不会这样做呢?
  • 这与while(true)for(;;) 无关。无限循环不能被中断或取消,当您编写无限循环时,编译器会将循环后的代码标记为不可达。相反,您问题中的代码 可达的。由于您使用它的方式,它只是等待了很长时间。

标签: java concurrency java-8 scheduled-tasks java.util.concurrent


【解决方案1】:

方法

Future.get()

阻塞直到进程完成,因此您的代码示例将永远不会执行最后两行。如果您删除倒数第二行,您应该会在输出中看到 false

【讨论】:

    【解决方案2】:

    scheduleAtFixedRate 返回一个Future,描述如下:

    ...任务只会通过取消或终止执行者来终止。

    所以调用它的get 方法将永远等待,因为:

    Future.get()

    如有必要,等待计算完成,然后检索其结果。

    因此,您将永远等待Future.get() 方法返回。

    【讨论】:

      【解决方案3】:

      我从互联网和 oracle 文档得到的答案是:-

      首先:- 您可以创建一个无限次运行的程序,例如 while(true) 代码。但是 java 没有显示警告应该是中断条件。

      其次:- 假设你想创建一个system or daemon 线程然后使用该方法。

      第三:是的,如果您想在一定时间后终止使用另一种方法:-

      Oracle should provide a method like which automatically terminate after given time elapsed.

      【讨论】:

      • 如果您希望get() 在一段时间后返回,只需使用get with a timeout。如果您不指定超时,则不会有超时,这不值得讨论。
      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2020-10-10
      • 2020-05-14
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多