2013-08-29 63 views
1

我正在開發一個用java編寫的模擬程序,我們發現我們需要一個輕量級的java程序,在某個(隨機生成的)時間自行關閉,執行一些任務,然後安排下一個任務(隨機生成以及從第一項任務的結果中產生)。Java自助計劃/服務?

該程序目前在Linux環境下運行,但我想保持選項打開,以便將來可以在OSX和Windows環境中運行。

我該如何在java中調度這些而無需在調度中使用太多資源?

+1

你不能,除非它是由從另一個進程中隨機產生了過程開始隨機。一個Java進程隨機間隔執行另一個Java進程。 –

+0

我想我應該澄清。那一點。第一項任務是手動啓動,之後的所有任務都是隨機生成的,並基於前一任務的結果。 –

回答

2

ScheduledThreadPoolExecutor javadocs推薦使用它有利於Timer

它可另行安排的命令在給定的延遲後運行 ,或者定期地執行甲的ThreadPoolExecutor。當需要多個工作線程時,或者需要ThreadPoolExecutor (該類擴展)的附加靈活性或功能時,此類最好爲Timer的 。

public class TaskTimer { 
    public static void main(String[] args) { 
     ScheduledExecutorService svc = Executors.newScheduledThreadPool(0); 
     svc.schedule(new Task(svc), 2, TimeUnit.SECONDS); 
    } 
} 

class Task implements Callable<Result> { 

    private ScheduledExecutorService svc; 

    public Task(ScheduledExecutorService svc) { 
     this.svc = svc; 
    } 

    @Override 
    public Result call() throws Exception { 
     Result result = compute(); 
     Task t = nextTask(result); 
     svc.schedule(t, 2, TimeUnit.SECONDS); 
     return result; 
    } 

    private Task nextTask(Result result) { 
     return new Task(svc); 
    } 

    private Result compute() { 
     System.out.println("Computing Result"); 
     return new Result(); 
    } 

} 

class Result { 

} 
1

最大的可移植性讓Java程序連續運行,只是做的事情在某些時候使用標準Java Timer

如果你想持續的計時器,這是崩潰並重新啓動性能好,如果你不介意使用Glassfish等Java EE服務器(即使是輕量級任務,我也會推薦它),那麼您可以使用Java EE中標準的persistent timers

+0

我認爲公平地說,如果這樣一個連續的程序是正確的,它將使用旁邊沒有資源。 (如果它沒有正確寫入,它仍然可以每天使用WTF –

+0

正確。緊挨着零資源,這非常高效。另外,Timer有一個接口,可以有效地取消先前計劃的任務。 – necromancer

+0

作爲隨後的答案提到,如果你的任務做了一些不平凡的事情,'ScheduledThreadPoolExecutor'是一個更好的選擇。如果您的任務需要一些時間才能完成,那麼定時器將導致「聚集」,這與時間表的分辨率有很大關係。 – necromancer

0

您可以使用優先級隊列

基本上你把第一個任務的優先級隊列

彈出它

,在轉彎生成隨機任務,每個這樣的 任務優先級分配

當您將它們添加到優先級 隊列時,排序將自然發生。

根據您需要等待多少時間才能開始彈出,如果某個特定的 任務需要特定的時間等待。

then do something like this.