Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何在从睡眠或休眠中醒来时触发函数?_Java_Multithreading_Javafx_Sleep - Fatal编程技术网

在Java中,如何在从睡眠或休眠中醒来时触发函数?

在Java中,如何在从睡眠或休眠中醒来时触发函数?,java,multithreading,javafx,sleep,Java,Multithreading,Javafx,Sleep,我的线程在后台工作,计算新的一天之前的时间,等待那个时间,然后更新我的UI。当计算机从睡眠或休眠状态唤醒时,如何使程序重新启动此线程?您应该能够将系统配置为在系统启动时自动启动Java应用程序。问题是如何应对系统休眠 这并不是你所要求的,但我认为这是同样的:在Java应用程序中,缩短你的睡眠时间(例如5分钟),在你调用Thread.sleep()之前,计算你认为线程应该在什么时候醒来。如果您当前醒来的时间与您预期的时间明显不同,您可以假设系统处于休眠状态,您可以根据新的日期估计调整任何时间。当然

我的线程在后台工作,计算新的一天之前的时间,等待那个时间,然后更新我的UI。当计算机从睡眠或休眠状态唤醒时,如何使程序重新启动此线程?

您应该能够将系统配置为在系统启动时自动启动Java应用程序。问题是如何应对系统休眠

这并不是你所要求的,但我认为这是同样的:在Java应用程序中,缩短你的睡眠时间(例如5分钟),在你调用Thread.sleep()之前,计算你认为线程应该在什么时候醒来。如果您当前醒来的时间与您预期的时间明显不同,您可以假设系统处于休眠状态,您可以根据新的日期估计调整任何时间。当然,如果你每隔n分钟睡觉一次,那么你可以调整你的逻辑,让自己睡n分钟或者直到午夜,以较早的时间为准

我在可以挂起的虚拟机上运行了此代码,并在VM挂起时正确识别了该代码:

    long pause = 10000L;
    long error = 100L;

    while (true) {
        long sleepTil = System.currentTimeMillis() + pause + error;
        try { Thread.sleep(pause); } catch (InterruptedException e) { }
        if (System.currentTimeMillis() > sleepTil) {
            System.out.println("System was suspended");
        } else {
            System.out.println("System was not suspended.");
        }       
    }

使用OS钩子,这在Java中是不可能的。你为什么要用高级语言做低级的事情?这就像试图用Python编写操作系统一样。当然,这将是有史以来最伟大的东西,但祝你在任何芯片上运行它好运。(如果有人用Python编写了一个操作系统,并设法让它直接在他们的CPU上运行,现在就给我。)我只需要在新的一天开始/醒来之前计算时间。如果你能提出任何其他的解决方案,我会很乐意阅读……好吧,我做了一些研究,结果证明我错了。索塔。假设它是Windows(在这种情况下,您将使Java的最大优点失效),那么您可以使用编译好的JAR文件。然而,在启动时,当它脱离睡眠时不会触发。我仍然在寻找这样做的方法。我知道可以监听用户登录/注销事件(请参阅),因此应该可以监听唤醒/休眠事件(请参阅与看起来相关的内容)。我只是不知道有什么样的演示/示例代码把它们放在一起。这并不是我想要的。在我的例子中,我的线程长时间处于休眠状态,我需要在系统唤醒后立即重新启动它。您编写的方法检查时间差,以便它可以检测系统是否处于睡眠状态。没有足够的准确性,如果要检查“睡眠”,我需要依赖循环检查,那么我只需要在我的初始线程中消除长时间的等待。我需要的是在系统唤醒后立即触发线程重启的方法,它不应该是用于循环检查的另一个线程,因为这样做没有意义。