我正在研究java中的模拟程序,我们发现我们需要一个轻量级的java进程在某个(随机生成的)时间自行启动,执行一些任务,然后安排下一个任务(随机生成以及从第一个任务的结果生成)。
该程序目前在Linux环境中运行,但我希望保持选项打开,以便将来可以在OSX和Windows环境中运行。
如果不在调度上使用太多资源,我如何在java中安排这些?
答案 0 :(得分:2)
根据ScheduledThreadPoolExecutor
javadocs的建议,使用它支持Timer
一个ThreadPoolExecutor,可以另外安排运行命令 在给定的延迟之后,或定期执行。这堂课是 当需要多个工作线程时,或者何时,优先于Timer ThreadPoolExecutor的额外灵活性或功能 (这个类扩展)是必需的。
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 :(得分:1)
为了获得最大的可移植性,让java程序连续运行,并使用标准java Timer
在特定时间执行操作如果你想要持久的计时器,它们可以防止崩溃和重新启动,如果你不介意使用像Glassfish这样的Java EE服务器(即使是轻量级的任务我也推荐它),那么你可以使用{ {3}}是Java EE中的标准。
答案 2 :(得分:0)
您可以使用优先级队列
基本上你将第一个任务放入优先级队列
弹出
反过来生成随机任务为每个任务分配优先级 任务
当您将它们添加到优先级时,自然会发生排序 队列中。
根据特定时间需要等待的时间开始弹出 任务需要特定的时间等待。