java - 如何在单线程中使用多个可运行接口(interface)?

标签 java multithreading runnable scheduledexecutorservice

我正在开发一个计算各种数学函数的java应用程序。 这是场景, 我有M个可运行的任务(每个任务用于计算各种问题,例如一个解决二次方程,另一个解决指数函数,类似的事情)。 这些M 个可运行程序必须每 N 分钟执行一次。这些可运行程序可以顺序执行,不一定以并行方式执行。 我不允许创建多个线程

我可以使用ScheduledExecutorService定期运行任务。根据 Javadoc,只有一个可运行对象可以与 ScheduledExecutorService 一起使用。 有像 invokeAll(...) 这样的方法,它允许我们提供可运行的集合,但这些方法不提供调度选项。

在浏览互联网时我发现,使用Thread.sleep()并不是开发应用程序的好方法

有什么建议吗?

最佳答案

您可以创建仅包含一个线程来运行作业的 ExecutorService:

ExecutorService executorService = Executors.newSingleThreadExecutor();

当您使用 invokeAll 方法向此服务提交多个作业时,它将使用单个 Thread 实例按顺序运行它们。

如果您想使用 ScheduledExecutorService 每 N 分钟运行一次作业,您可以切换到

ScheduledExecutorService scheduledExecutorService = 
    Executors.newSingleThreadScheduledExecutor();

这将为您提供额外的方法来更好地控制您的工作。

如您所见,invokeAll 方法派生自 ExecutorService,因此它不为您提供调度选项。但这只是一个快捷方式,您可以使用常规循环来调度多个 Runnable 实例:

for (Runnable job : allJobs) {
    scheduledExecutorService.scheduleAtFixedRate(job, 0L, N, TimeUnit.MINUTES);
}

关于java - 如何在单线程中使用多个可运行接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177569/

相关文章:

java - Java 中的 jTable 编码

multithreading - Grails:将值从 Controller 传递到线程

java - Runnable 中的无限循环消失了?

java - 如何获取 XMLEventAllocator 的实例?

java - 从 1.3.x 升级到 1.4.0 后,Spring boot ssl 配置损坏

消费者-生产者。没有错误。有时工作。为什么?

Java 等待可运行完成

java - 当我单击注销按钮时,如何阻止 Android 应用程序将挂起位置发送到网络服务器?

java - Android - 通过ScrollView的一部分传递触摸事件

multithreading - 在 Scala 中包装不可变集合并维护线程安全?