2

私はJavaでシミュレーションプログラムに取り組んでおり、軽量のJavaプロセスが特定の(ランダムに生成された)時間に開始され、いくつかのタスクを実行し、次のタスク(同様にランダムに生成された)をスケジュールする必要があることがわかりました最初のタスクの結果から生成されます)。

このプログラムは現在 Linux 環境で実行されていますが、将来的には OSX および Windows 環境で実行できるようにオプションを開いておきたいと考えています。

スケジューリングでリソースをあまり使用せずに、Java でこれらをスケジュールするにはどうすればよいですか?

4

3 に答える 3

3

ScheduledThreadPoolExecutorjavadocsで推奨されているように、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 {

}
于 2013-08-30T00:33:20.170 に答える
1

移植性を最大限に高めるには、Java プログラムを継続的に実行し、標準の Javaタイマーを使用して特定の時間だけ実行します。

クラッシュや再起動に強い永続的なタイマーが必要で、Glassfish などの Java EE サーバーの使用を気にしない場合 (軽量のタスクでもお勧めします)、永続的なタイマーを使用できます。 Java EE の標準。

于 2013-08-29T23:57:59.390 に答える
0

優先キューを使用できます

基本的に、最初のタスクを優先キューに入れます

ポップ

次に、ランダムなタスクを生成し、それらの各タスクに優先度を割り当てます

それらを優先キューに追加すると、順序付けは自然に行われます。

特定のタスクが特定の待機時間を必要とする場合、待機に必要な時間に基づいてポップを開始します。

次に、このようなことをします。

于 2013-08-30T00:03:53.963 に答える