我正在开发一个计算各种数学函数的java应用程序。 这是场景, 我有 M可运行的任务(每个用于计算各种问题,例如一个解决二次方程,其他解决指数函数,类似的东西)。 这些 M runnables必须每N分钟执行一次。这些可运行的顺序执行,不一定是并行执行。 我不允许创建多个帖子。
我可以使用 ScheduledExecutorService 定期运行任务。根据Javadoc,ScheduledExecutorService只能使用一个runnable。 有一些方法,如 invokeAll(...) ,它允许我们提供runnable的集合,但这些不提供调度选项。
在浏览互联网时我发现,使用 Thread.sleep()不是开发应用程序的好方法 。
有什么建议吗?
答案 0 :(得分:1)
您可以创建仅包含一个线程的ExecutorService
来运行您的作业:
ExecutorService executorService = Executors.newSingleThreadExecutor();
使用invokeAll
方法向此服务提交多个作业时,它将使用单个Thread
实例按顺序运行它们。
如果您想每隔N分钟使用ScheduledExecutorService
来运行作业,可以切换到
ScheduledExecutorService scheduledExecutorService =
Executors.newSingleThreadScheduledExecutor();
将为您提供更好的方法来更好地控制您的工作。
正如您所看到的,invokeAll
方法派生自ExecutorService
,因此它不会为您提供计划选项。这只是一个快捷方式,你可以使用常规循环来安排多个Runnable
实例:
for (Runnable job : allJobs) {
scheduledExecutorService.scheduleAtFixedRate(job, 0L, N, TimeUnit.MINUTES);
}
答案 1 :(得分:0)
如果您创建如下所示的多个可运行类,则可以将其实例传递给调度程序,它将运行您实例化的所有可运行的类。调度程序完成剩下的工作,这只是顺序运行runnables数组。
public class MultipleRunnable implements Runnable
{
private Runnable[] commands;
public MultipleRunnable(Runnable[] commands)
{
this.commands = commands;
}
public void run()
{
for(int i = 0 ; i < commands.length ; i++)
{
commands[i].run();
}
}
}
这样的事情应该起作用:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
new MultipleRunnable(new Runnable[]{run1, run2, ..., runM}),
n, n, TimeUnit.MINUTES);