我正在用java编写一个模拟程序,我们发现我们需要一个轻量级的java进程来在某个(随机生成的)时间启动自己,执行一些任务,然后安排下一个任务(也是随机生成的)从第一个任务的结果生成)。
该程序当前在 linux 环境中运行,但我想保持选项打开,以便将来可以在 OSX 和 Windows 环境中运行。
我如何在 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在特定时间做一些事情
如果您想要持久的计时器,它可以抵抗崩溃和重启,并且如果您不介意使用 Java EE 服务器,例如 Glassfish(即使是轻量级任务,我也会推荐它),那么您可以使用持久计时器Java EE 中的标准。
您可以使用优先队列
本质上,您将第一个任务放入优先级队列
弹出它
依次生成随机任务,为这些任务中的每一个分配优先级
当您将它们添加到优先级队列时,排序将自然发生。
如果特定任务需要特定时间等待,则根据需要等待的时间开始弹出。