2014-03-04 139 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

相關問題