我正在開發一個用java編寫的模擬程序,我們發現我們需要一個輕量級的java程序,在某個(隨機生成的)時間自行關閉,執行一些任務,然後安排下一個任務(隨機生成以及從第一項任務的結果中產生)。Java自助計劃/服務?
該程序目前在Linux環境下運行,但我想保持選項打開,以便將來可以在OSX和Windows環境中運行。
我該如何在java中調度這些而無需在調度中使用太多資源?
我正在開發一個用java編寫的模擬程序,我們發現我們需要一個輕量級的java程序,在某個(隨機生成的)時間自行關閉,執行一些任務,然後安排下一個任務(隨機生成以及從第一項任務的結果中產生)。Java自助計劃/服務?
該程序目前在Linux環境下運行,但我想保持選項打開,以便將來可以在OSX和Windows環境中運行。
我該如何在java中調度這些而無需在調度中使用太多資源?
如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 {
}
最大的可移植性讓Java程序連續運行,只是做的事情在某些時候使用標準Java Timer
如果你想持續的計時器,這是崩潰並重新啓動性能好,如果你不介意使用Glassfish等Java EE服務器(即使是輕量級任務,我也會推薦它),那麼您可以使用Java EE中標準的persistent timers。
我認爲公平地說,如果這樣一個連續的程序是正確的,它將使用旁邊沒有資源。 (如果它沒有正確寫入,它仍然可以每天使用WTF –
正確。緊挨着零資源,這非常高效。另外,Timer有一個接口,可以有效地取消先前計劃的任務。 – necromancer
作爲隨後的答案提到,如果你的任務做了一些不平凡的事情,'ScheduledThreadPoolExecutor'是一個更好的選擇。如果您的任務需要一些時間才能完成,那麼定時器將導致「聚集」,這與時間表的分辨率有很大關係。 – necromancer
您可以使用優先級隊列
基本上你把第一個任務的優先級隊列
彈出它
,在轉彎生成隨機任務,每個這樣的 任務優先級分配
當您將它們添加到優先級 隊列時,排序將自然發生。
根據您需要等待多少時間才能開始彈出,如果某個特定的 任務需要特定的時間等待。
你不能,除非它是由從另一個進程中隨機產生了過程開始隨機。一個Java進程隨機間隔執行另一個Java進程。 –
我想我應該澄清。那一點。第一項任務是手動啓動,之後的所有任務都是隨機生成的,並基於前一任務的結果。 –