Java自我安排计划/服务?

时间:2013-08-29 23:46:54

标签: java scheduling

我正在研究java中的模拟程序,我们发现我们需要一个轻量级的java进程在某个(随机生成的)时间自行启动,执行一些任务,然后安排下一个任务(随机生成以及从第一个任务的结果生成)。

该程序目前在Linux环境中运行,但我希望保持选项打开,以便将来可以在OSX和Windows环境中运行。

如果不在调度上使用太多资源,我如何在java中安排这些?

3 个答案:

答案 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)

您可以使用优先级队列

  

基本上你将第一个任务放入优先级队列

     

弹出

     

反过来生成随机任务为每个任务分配优先级   任务

     

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

     

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

then do something like this.