2014-03-04 138 views
0

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

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

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

任何建议?

+0

'ScheduledExecutorService'看起来像一个非常适合我,因为给定的用例。文档中哪里只说一个Runnable? – nullpotent

+0

如果你一次只能运行一件事,而你需要安排一些事情,我认为你可以使用石英和jms的组合。 – Leo

回答

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); 
} 
+0

当你希望它们全部按顺序同时运行时,单独安排它们看起来有点奇怪。为什么不把它们组合成像我的答案一样可运行? – Cruncher

+0

作者应该能够更好地选择他喜欢的东西 - 这就是为什么我们有可能提供多个答案。就你而言 - 无论如何,作业不会同时运行,因此无论是在一个计划作业中还是使用多个作业运行作业都无关紧要。 – hoaz

+0

@Cruncher我认为这实际上是一个更清洁,更灵活的解决方案,假设它正常工作。 –

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); 
+0

我可以创建M Classes而不是runnable,并在单个可运行接口内依次调用它们。然后我需要使用ScheduledExecutorService只调度一个可运行的。对于给定的情况,它也做这项工作。此外,可运行的接口在这里使用不当。但我需要使用多个可运行接口来提高应用程序的灵活性。无论如何,感谢您的回复:) – Adithyan

+0

@Adithyan这是如何使用Runnable接口不当?而且,这个类是相当抽象的,它并没有告诉你如何定义所有的runnables。通过阅读我曾经假设你已经拥有你的可运行列表的问题。这只需要你的一组runnables并将它们包装成一个可运行的,你可以传递给任何可以运行的东西。 – Cruncher

+0

@Adithyan你是对的,那对于给定的场景将起作用。但是这种解决方案每次都必须进行硬编码。这是任何一组可运行对象的通用解决方案。 – Cruncher

相关问题