gpt4 book ai didi

java - 如何使用 ScheduledExecutorService 安排 2 个不同的任务

转载 作者:行者123 更新时间:2023-11-30 06:01:04 25 4
gpt4 key购买 nike

我有 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。一次只能运行一个任务。

方法 2:

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,每个任务一个。

这两种方法的内部差异/优缺点是什么?

最佳答案

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

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

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

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

关于java - 如何使用 ScheduledExecutorService 安排 2 个不同的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com