【问题标题】:How to schedule 2 different tasks using ScheduledExecutorService如何使用 ScheduledExecutorService 安排 2 个不同的任务
【发布时间】:2018-09-10 18:50:08
【问题描述】:

我有 2 个任务 t1 和 t2。我应该如何安排他们。两者都有自己的延迟{d1,d2}和周期{p1,p2}。

方法一:

我应该使用

ScheduledExecutorService ser = Executors.newScheduledThreadPool(2);

ser.scheduleAtFixedRate(t1, 1, 3, TimeUnit.SECONDS);
ser.scheduleAtFixedRate(t2, 2, 5, TimeUnit.SECONDS);

这里我使用了大小为 2 的线程池。所以这两个任务可以并行运行。但是如果一个任务不会运行,线程就会处于空闲状态。

如果我将线程池大小设为 1。一次只能运行一个任务。

方法二:

ScheduledExecutorService ser1 = Executors.newScheduledThreadPool(1);
ScheduledExecutorService ser2 = Executors.newScheduledThreadPool(1);

ser1.scheduleAtFixedRate(t1, 1, 3, TimeUnit.SECONDS);
ser2.scheduleAtFixedRate(t2, 2, 5, TimeUnit.SECONDS);

这里我为每个任务使用了 2 个 ScheduledExecutorService。

这两种方法的内部差异/优势-劣势是什么?

【问题讨论】:

  • 使用两个线程池可以获得什么?
  • @John Kane 是的,这就是我想了解的内部结构。会有什么不同。

标签: java scheduledexecutorservice executors


【解决方案1】:

我肯定希望在大多数代码中看到第一个。线程池的概念实际上是您有一个线程池供您根据需要使用。您可以通过 executor 一次性管理它们。此外,由于它是一个有限/有界池,因此您可以确保如果发送的任务过多,您不会一次运行所有任务(因此,它就像一个保障措施)。

创建单独的线程池没有意义;它失去了这些好处......在这种情况下,您可以为每个任务创建一个简单的计时器。

如果您真的关心这种详细程度,您实际上可以获得对线程池的更多控制(例如,在特定时间后取消空闲线程)。看看这个:https://www.codejava.net/java-core/concurrency/java-concurrency-understanding-thread-pool-and-executors

它并不特定于调度线程池,但我几乎可以保证,如果您深入研究,您可以使用它们实现相同的目标。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 2016-12-25
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多