Thread.sleep(x)是否足以在Android中用作时钟?

时间:2015-10-25 22:38:46

标签: 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.");

    }
}

2 个答案:

答案 0 :(得分:5)

不,它根本不准确,

来自文档:

(暂时停止       执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。 换句话说,这种睡眠是OS或环境依赖的,你无法预测OS调度决策,另外,睡眠可以通过中断终止。

再次来自文档:

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

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

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

答案 1 :(得分:3)

我建议使用ScheduledThreadPoolExecutor的scheduleAtFixedRate()方法,因为它会在每个给定时间触发,无论run()方法中的代码需要多长时间才能完成。

我认为会是这样的:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
            // Do your stuff      
    }
});

ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses.scheduleAtFixedRate(runnable, 0, 100, TimeUnit.MILLISECONDS);