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 Timer在特定时间做一些事情

如果您想要持久的计时器,它可以抵抗崩溃和重启,并且如果您不介意使用 Java EE 服务器,例如 Glassfish(即使是轻量级任务,我也会推荐它),那么您可以使用持久计时器Java EE 中的标准。

于 2013-08-29T23:57:59.390 回答
0

您可以使用优先队列

本质上,您将第一个任务放入优先级队列

弹出它

依次生成随机任务,为这些任务中的每一个分配优先级

当您将它们添加到优先级队列时,排序将自然发生。

如果特定任务需要特定时间等待,则根据需要等待的时间开始弹出。

然后做这样的事情。

于 2013-08-30T00:03:53.963 回答