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



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

方法1:

我应该使用

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。

它不是特定于预定线程池的,但我几乎可以保证,如果你四处挖掘,你可以用它们实现同样的事情。

相关内容

  • 没有找到相关文章

最新更新