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

时间:2018-09-10 18:50:09

标签: java scheduledexecutorservice executors

我有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。

这两种方法在内部有什么区别/优缺点?

1 个答案:

答案 0 :(得分:1)

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

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

如果您真的很在乎这一详细级别,则实际上可以对线程池进行更多控制(例如,在特定时间后取消空闲线程)。请查看以下内容:https://www.codejava.net/java-core/concurrency/java-concurrency-understanding-thread-pool-and-executors

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