java - Java/C 中以毫秒为单位的精确 sleep

标签 java windows-7 java-native-interface thread-sleep

我正在寻找一种方法,可以在 Java 或 C 中将线程暂停精确的毫秒数(我可以使用 JNI 来访问 C 方法。

到目前为止,我在 java 代码中使用了以下内容。

LinkedBlockingQueue<String> SLEEPER = new LinkedBlockingQueue<String>();
SLEEPER.poll(msTime, TimeUnit.MILLISECONDS); 

这是在本论坛的一个主题中建议的,并且在我们的大多数 Windows7 计算机上运行良好。

但它并没有在一组新硬件上给我准确的结果。所以我决定使用 JNI 来访问 C。但即使这样,在新硬件上(Windows7 上的 Dell 和 HP)也不会暂停精确的毫秒数。

JNIEXPORT void JNICALL Java_JniTimer_jniWait(JNIEnv *env, jobject obj , jint waitTime )              {

HANDLE hWaitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
   if (hWaitEvent) 
    {

    WaitForSingleObject(hWaitEvent,waitTime);
        CloseHandle (hWaitEvent);
    }
    }

有没有人有可靠的选择来准确地在线程上 sleep 。 谢谢。

最佳答案

您无法在非 RT 操作系统上执行此操作。

并不是因为计时器的分辨率,而是因为每个线程的“时间片”(有时称为“量子”)通常设置为几毫秒(在我的古董 XP 上为 15 毫秒)在这里),这不是你可以随便玩的东西。

关于java - Java/C 中以毫秒为单位的精确 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13319634/

相关文章:

java - 用户为 z/OS 上的 Java 程序指定的 ABEND 代码

java - C 指针 - 从 Char 到 Char 的无效转换*

java - 从 headless Eclipse 导出 war

java - 预期状态 :<200> but was:<400> error with MockMvc

unicode - 记事本可以读取UTF-32吗?

c# - 在 Windows Vista 和 7 中,我无法访问 %DEFAULTUSERPROFILE% 系统变量 - 它显示为未找到

c++ - Windows 7 和 Windows 8 进程 "ring"控件

安卓 JNI 错误 : warning: initialization makes integer from pointer without a cast

java - 忽略分割字符串的第一部分

java - 需要捕获 IOException 和异常