java - Android - 执行任务,等待,什么都不做,然后再次执行任务?

标签 java android multithreading

现在我正在尝试创建一个在 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,这应该会停止执行此函数。然而,在测试中,我注意到这种情况在应该发生的相当长一段时间内都不会发生,并且因为在我猜测那里存在问题之前我从未对线程做过太多工作。

那么我应该做什么呢?

谢谢。

最佳答案

我不确定您是否以正确的方式处理此问题,但以下是修复当前代码的方法。

1)使您的标志变量可变。

2) 为该标志提供同步的 getter 和 setter 方法。

该问题是由 Java 的内存模型引起的。由于您有 2 个线程访问同一字段,因此您需要提供一种方法来同步它们的访问。现在,两个线程可能看不到彼此对共享字段的更改。对于简单的 boolean 值,使用 volatile 可能更有效。

关于java - Android - 执行任务,等待,什么都不做,然后再次执行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462249/

相关文章:

javascript - 在单线程环境中这种 Jquery 行为如何可能?

java - 我可以在 Java 中创建一个没有函数的线程吗?

java - 在 Selenium 中有哪些有用的测试?

java - 查询必须以 select 或 from : update 开头

java - struts2 应用程序未运行

java - Java中如何查看一个数组是否包含另一个数组的所有元素?

android - Google 对企业 Android 开发的支持

python - 从Python中的一个线程读取值: queue or global variable?

android - 任务 ':app:dexDebug' 非零退出值 2 执行失败

java - firebase startAt() endAt() 方法