我在我的主类中运行了一个单独的线程.它需要每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."); } }
解决方法
不,它根本不准确,
来自文档:
(暂时停止
执行)指定的毫秒数,取决于系统定时器和调度程序的精度和准确性.
换句话说,这种睡眠是OS或环境依赖的,你无法预测OS调度决策,另外,睡眠可以通过中断终止.
再次来自文档:
此外,它效率不高,因为你只是为了睡觉而浪费cpu周期.
ScheduledExecutorService将提供更好的精度和性能.只需将您的任务包装在Callable或Runnable中,并使用ScheduledExecutorService来执行它们,那里有很多教程.