【问题标题】:Java Self Scheduling Program / Service?Java自调度程序/服务?
【发布时间】:2013-08-29 23:46:53
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能让一个进程随机启动,除非它是从另一个进程随机生成的。一个 Java 进程以随机间隔执行另一个 Java 进程。
  • 我想我应该澄清一下。那个点。第一个任务是手动启动的,之后的所有任务都是根据前一个任务的结果随机生成的。

标签: java scheduling


【解决方案1】:

按照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 {

}

【讨论】:

    【解决方案2】:

    为了获得最大的可移植性,让 java 程序连续运行,并在特定时间使用标准 java Timer 执行操作

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

    【讨论】:

    • 我认为公平地说,如果这样一个连续的程序写得正确,它几乎不会使用任何资源。 (如果写得不对,它仍然可以在dailyWTF上继续
    • 正确。接近零资源。这是非常有效的。此外,Timer 有一个接口,可以有效地取消先前计划的任务。
    • 作为后续答案提到的,ScheduledThreadPoolExecutor 是一个更好的选择,如果您的任务正在做一些不平凡的事情。 Timer 如果您的任务需要一些时间来完成,这对于计划的解决很重要,则会导致“捆绑”。
    【解决方案3】:

    你可以使用优先队列

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

    弹出来

    依次生成随机任务,为每个任务分配优先级 任务

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

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

    then do something like this.

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2012-07-22
      • 1970-01-01
      • 2014-07-03
      • 2011-05-10
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多