【问题标题】:ScheduledExecutorService not creating concurrent threadsScheduledExecutorService 没有创建并发线程
【发布时间】:2021-01-25 01:18:22
【问题描述】:

我正在尝试了解 ScheduledExecutorService 的工作原理。我写了这个简单的测试:

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);
    executorService.scheduleAtFixedRate(() -> {
      try {
        System.out.println("Test " + Thread.currentThread().getId());
        Thread.sleep(10000);
        System.out.println("End  " + Thread.currentThread().getId());
      } catch (Exception ex) {

      }
    }, 0, 100, TimeUnit.MILLISECONDS);

我看到控制台上打印了以下内容:

Test 19
End  19
Test 19
End  19
Test 21
End  21

等等。执行程序不应该在第一个线程结束之前安排并启动一个新线程吗?如果核心池大小为 10,为什么线程一个接一个地启动。不应该 10 个线程一起运行。

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    重复任务是不重叠的,因此第一次调用需要在下一次调用开始之前完成:

    通过 scheduleAtFixedRate 或 scheduleWithFixedDelay 计划的任务的连续执行不重叠。虽然不同的线程可能会执行不同的执行,但之前执行的效果会发生在后续执行的效果之前。

    如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。

    https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#scheduleAtFixedRate-java.lang.Runnable-long-long-java.util.concurrent.TimeUnit-

    【讨论】:

    • 谢谢,那么核心池的用途是什么?会不会有什么影响? @钢铁侠
    • 不同的任务仍然可以同时运行。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多