如何在单线程中使用多个runnable接口?

时间:2014-03-04 16:32:11

标签: java multithreading runnable scheduledexecutorservice

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

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

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

有什么建议吗?

2 个答案:

答案 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);