当前位置: 首页 > 面试题库 >

Java调度程序完全独立于系统时间更改

蓝苗宣
2023-03-14
问题内容

使用Java计时器,然后切换到ScheduledExecutorService,但我的问题未解决。由于系统时间更改之前安排的任务(通过ntpd)不会按指定的延迟执行。没有日志,什么也没有发生:(。

在64位Linux上的目标中使用jre 1.6.0_26 64位。

更新:
ScheduledExecutorService在Windows上运行正常。问题仅存在于运行64位JVM的基于64位Linux的系统上。它在运行32位JVM
…奇怪的64位Linux上运行良好。也没有在任何博客上找到相同的参考。

IBM的JAVA SDK也有相同的问题(ibm-java-sdk-7.0-0.0-x86_64-archive.bin)。

我已针对JDK
7139684提出缺陷,该缺陷已被接受,但已被关闭并标记为
6900441的副本。如果您觉得值得将其修复,请对其投赞成票…我不知道为什么自两年多以来就没有修复它

这是我用来测试此问题的示例代码:

package test;

import java.io.IOException;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @author yogesh
 *
 */
public class TimerCheck  implements Runnable {

    ScheduledExecutorService worker;


    public TimerCheck(ScheduledExecutorService worker) {
        super();
        this.worker = worker;
        this.worker.schedule(this, 1, TimeUnit.SECONDS);
    }

    private static void update() {
        System.out.println("TimerCheck.update() "+new Date(System.currentTimeMillis()));
    }

    @Override
    public void run() {
            update();
            worker.schedule(this, 1, TimeUnit.SECONDS);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        ScheduledExecutorService worker = Executors.newScheduledThreadPool(1);
        new TimerCheck(worker);
    }

}

问题答案:

JVM中存在一个错误,无法在Sytem时间向后更改期间进行整体调度,这也影响了非常基本的Object.wait和Thread.sleep方法。当系统时间倒退甚至几秒钟时,保持Java
App运行变得太冒险了。您永远都不知道Java应用程序最终会变成什么样。

因此,我们决定:

  • 编写看门狗脚本(非Java :))以检查时间变化。
  • 如果时间倒退一定时间,请关闭并重新启动Java应用程序

另一种可能性是迁移到32位JVM,但是我们使用的是JNI,然后目标平台上使用的本机库不兼容32位。同样,根据我们的经验,32位JVM将我们的目标限制为1.6G堆,这对于我们来说根本不够用。

我知道我们的解决方案不是最优雅的解决方案,但是直到JVM修复或找到更好的解决方案之前,似乎没有其他办法。

编辑: 除了上述解决方案之外,我们还考虑了克里斯的第一条建议:

  • 将NTP配置为永远不会跳太长时间。慢慢改变时间。在停机期间仅手动应用较大的时间跳跃。


 类似资料:
  • 我正在尝试理解这些调度算法: 先到先得(FCFS) 最短作业优先(SJF) 最短剩余时间(SRT) 循环赛(RR) 因此,给定一些输入: FCFS将安排为。 我似乎无法弄清楚其余的。有人可以帮助我解释差异吗? 我试过谷歌搜索,但我为SJF得到的结果有点令人困惑。

  • 我想以一种最大限度地将Python与系统和系统提供的库和程序分离的方式安装Python。它应该在自己的目录中编译,并且只需要访问系统提供的它需要编译的东西。(这与Julia(参见源代码下载和编译部分)从源代码编译的方式相似。)然而,我不确定一般如何做到这一点。运行将创建一个Makefile,该Makefile是为使用系统提供的库而定制的,我在手写Makefile方面没有足够的经验;尤其是对于具有广

  • 问题内容: 我正在开发一个用Java编写的程序,对于某些操作,它使用用户配置的命令行启动外部程序。当前它使用并且不保留引用(启动的程序是文本编辑器或存档实用程序,因此不需要系统输入/输出/错误流)。 但是,这有一个小问题,即当Java程序退出时,直到所有启动的程序都退出后,它才真正退出。 如果启动的程序完全独立于启动它们的JVM,我将更喜欢它。 目标操作系统是多个,最低要求是Windows,Lin

  • 问题内容: 我正在尝试从python启动一个完全独立的进程。我不能使用像os.startfile这样的简单内容,因为我需要传递参数。目前,我正在使用subprocess.popen,它可以让我90%地到达那里。 将带有分离的创建标志和管道的popen用于std *确实会启动一个新进程,该进程在父进程死后仍然存在。这样就很好。问题在于,新的“子级”进程仍然为父级保留一个幻像句柄。因此,如果我尝试卸载

  • 发现问题! 假如按照上一讲的制作方法,设定了对话框的话,实际执行游戏时,会是下面的效果: 人物姓名占用了原本对话的第一行位置,并且把对话挤到第二行了。这当然可以通过调整对话框的文字显示范围来修改,但是只做这样的修改的话,名字和对话永远是对齐的,并且距离也是固定的。有没有什么办法作出“姓名和对话分开”的效果呢?答案当然是肯定的,只不过需要一点努力~ 将姓名与对话显示分离 这个修改没有图形界面,不过也

  • 问题内容: 我想知道当前的日期和时间。 代码 表示运行程序的系统的日期和时间,并且系统日期可能是错误的。 那么,无论运行哪个程序的系统日期和时间,有什么方法可以获取正确的当前日期和时间? 问题答案: 如果您在互联网上,则可以询问一个已知且受信任的时间源。如果运行您的程序的人希望阻止您的程序执行此操作(例如,如果您给他们授予了限时许可证,而他们又不想花更多的时间),那么他们可能会欺骗或阻止该连接。