有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程每小时运行一次Java代码

我正在尝试编写一个简单的Java程序,当分针在20时,它每小时运行一些代码。问题是,我这样做是难以置信的CPU密集型。我熟悉石英,但我正在寻找一个更简单的解决方案,有什么想法吗

    boolean run = true;
    while(run){
        Calendar calendar = new GregorianCalendar();
        int minute = calendar.get(Calendar.MINUTE);
        if(minute == 20){
            //Do some Stuff             
        }
    }

共 (6) 个答案

  1. # 1 楼答案

    我建议您从java程序中删除调度逻辑
    通过这样做,您可以只关注您希望程序执行的操作,并将调度部分留给操作系统
    也可以说,例如,你决定在某个时候编写一个C++程序,它可以完成java代码所知道的,你不必在新程序中实现CRON逻辑。

    • 对于Linux,您有crontab
    • 对于Windows,您有windows task schedule
    • 对于Mac,我不确定,但考虑到它是基于UNIX的cron,应该存在
  2. # 2 楼答案

    请注意,如果应用程序在托管环境(web或ejb容器)中运行,则不允许使用Thread.sleep()或任何其他与线程相关的操作,为此,请查看EJB restrictions页面。我对此提出警告,因为问题被标记为java-ee,所以“简单应用程序”可能根本就不是那么简单——如果它在JavaEE容器中运行,那么还有其他需要注意的事项

    如果您正在构建企业级应用程序,请忘记Thread.sleep()。选择一个成熟的作业调度器,使用Quartz,它是一个开源的、非常成熟和可靠的产品。或者使用Obsidian Scheduler,这是一个功能丰富的商业调度程序,比Quartz具有更多现成的功能

    对于成熟的调度器(但适合在容器中运行)来说,一个轻量级的替代方案是使用Timer service

  3. # 3 楼答案

    将您的代码放在无限长的时间内,然后使用

    Thread.sleep(3600000);
    

    20点后开始执行

    示例

    while(1==1) {
        //Your code here
        try{
             Thread.sleep(3600000);
        }
        catch (Exception e) {}
    }
    
  4. # 5 楼答案

    您可能在调用之间查找^{}

  5. # 6 楼答案

    一个简单的解决方案是使用Executors框架:

    final ScheduledExecutorService s = Executors.newSingleThreadScheduledExecutor();
    s.scheduleAtFixedRate(task, secondsToFirstOccurence, 60*60, TimeUnit.SECONDS);
    

    并使用一些逻辑来找出secondsToFirstOccurence。这可能会涉及一个Calendar实例,但使用JodaTime会方便得多