java - Thread.sleep(x) 是否足够准确以用作 Android 中的时钟?

标签 java android multithreading

我有一个单独的线程在我的主类中运行。它需要每 100 毫秒发送一次消息,但恰好每 100 毫秒发送一次。我想知道它是否足够准确,可以这样使用,或者是否有其他方法可以让某些事情每秒准确发生 10 次。

class ClockRun implements Runnable {

    @Override
    public void run() {
        double hourlyRate = Double.parseDouble(prefs.getString("hourlyRate", ""));
        double elapsedTime = 0;
        do {
            while(clockRun){
                double amount = hourlyRate / 360 /100 * elapsedTime;
                elapsedTime++;
                Bundle clockData = new Bundle();
                clockData.putString("value", String.format("$%.2f", amount));

                Message message = Message.obtain();
                message.setData(clockData);


                handler.sendMessage(message);

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }while (mainRun);

        Notify.viaToast(getApplication(), "Thread stopped.");

    }
}

最佳答案

不,它根本不准确,

来自文档:

(暂时停止 执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。 换句话说,这个 sleep 依赖于操作系统或环境,你无法预测操作系统的调度决定,此外, sleep 可以被中断终止。

再次来自文档:

In any case, you cannot assume that invoking sleep will suspend the thread for precisely the time period specified

此外,它效率不高,因为你会浪费 CPU 周期只是为了 sleep 。

ScheduledExecutorService将提供更好的精度和性能。 只需将您的任务包装在 Callable 或 Runnable 中并使用 ScheduledExecutorService 来执行它们,那里有很多教程。

关于java - Thread.sleep(x) 是否足够准确以用作 Android 中的时钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335906/

相关文章:

Java:这个进程分配了多少内存?

java - 0.0.0-SNAPSHOT 不支持 OpenNLP 模型版本 1.5.0

java - 在Java中抛出异常后重新启动同一个线程

java - 违反外键约束

java.lang.IllegalArgumentException : No query defined for that name

android - Paint.breakText 是否包含 maxWidth 处的字符?

java - 未找到默认 Activity 正在等待进程

android - 微调器列表中的禁用项

ios - 记录方法正在哪个队列/线程上运行

multithreading - 如何原子替换向量?