0

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

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

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

有什么建议么??

4

2 回答 2

1

您可以创建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);
}
于 2014-03-04T16:46:42.227 回答
0

如果您像下面这样创建多个可运行类,您可以将它的一个实例传递给您的调度程序,它将运行您实例化它的所有可运行类。调度程序完成其余的工作,这只是按顺序运行可运行的数组。

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);
于 2014-03-04T16:47:34.577 回答