现在我正在尝试创建一个增加音量的函数,而boolean flag1 == true。所以我想要做的是增加音量(我可以这样做),等待什么都不做(“nop”),然后再次检查旗帜。
我尝试用Thread.sleep()做一个while循环,但它给了一些不可靠的行为。请记住,我在一个可能已多次启动的服务中调用此函数,因此检查标志非常重要。
以下是我尝试过的示例:
private void cycleVolume() {
while (flag1 == true) {
mAudioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);
try {
Thread.sleep(750);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag1从BroadcastReceiver事件变为false,该事件应该有希望停止执行此函数。然而,在测试中,我注意到在它应该发生之后的一段时间内不会发生这种情况,并且因为在我猜测那里存在问题之前我从未做过很多线程。
那我该怎么做呢?
感谢。
答案 0 :(得分:2)
我不确定你是否采用正确的方法,但这里是如何解决当前的代码。
1)使你的标志变量不稳定。
2)为标志提供同步的getter和setter方法。
问题是由Java的内存模型引起的。由于您有2个线程访问同一个字段,因此您需要提供一种同步其访问权限的方法。现在,2个线程可能看不到彼此对共享字段的更改。对于使用volatile的简单布尔值可能更有效。
答案 1 :(得分:0)
这个代码在自己的Thread中运行是从服务中的某个地方开始的吗?如果你还没有创建一个单独的Thread,那么它会在进程主线程上运行并阻塞它,这可能会导致你的不可预测的结果。