我需要在我的代码中使用条件变量。查找 android API,我看到包 android.os 包含ConditionVariable。但我也在java.util.concurrent.locks 下找到了Condition 。
这两个类似乎是为同一目的而设计的。
Condition.await() <-> ConditionVariable.block()
Condition.signal() <-> ConditionVariable.open()
有什么我应该注意的区别吗?
我需要在我的代码中使用条件变量。查找 android API,我看到包 android.os 包含ConditionVariable。但我也在java.util.concurrent.locks 下找到了Condition 。
这两个类似乎是为同一目的而设计的。
Condition.await() <-> ConditionVariable.block()
Condition.signal() <-> ConditionVariable.open()
有什么我应该注意的区别吗?
如您链接的文档中所述,Condition
可以唤醒单个线程,而不是唤醒所有等待的线程(signal
vs signalAll
)。
ConditionVariable
是基于状态的,因此允许保持条件打开(与一次释放所有等待线程相比,使用open
and可以完全不阻塞线程close
)。
所以你应该使用Condition
if
ConditionVariable
那里不可用。ConditionVariable
,因为单个调用signalAll
比open
直接跟随close
.而你应该使用ConditionVariable
if
ConditionVariable
当它本质上是单次使用时使用 Android block()
。
Condition
当你有一个等待的循环时使用 Javaawait()
原因是等待者没有线程安全的方式block()
然后close()
(不使用额外的同步机制)。