Q1。 Java中的condVar是什么?如果我看到下面的代码,条件变量是否一定必须在“ mutex.acquire() ”和“
mutex.release() ”块内?
public void put(Object x) throws InterruptedException {
mutex.acquire();
try {
while (count == array.length)
notFull.await();
array[putPtr] = x;
putPtr = (putPtr + 1) % array.length;
++count;
notEmpty.signal();
}
finally {
mutex.release();
}
}
我有三个正在运行的线程 myThreadA , myThreadB 和 myThreadC ,它们调用相同的函数
commonActivity() 来触发函数 myWorkReport(), 例如
public void myWorkReport(){
mutexMyWork.acquire();
try{
while(runMyWork){
doWork();
conditionMyWork.timedwait(sleepMyWork);
}
}
finally{
mutexMyWork.release()
}
}
public void commonActivity(){
try{
conditionMyWork.signal();
}finally{
//cleanup
}
}
public void myThreadA(){
mutexA.acquire();
try{
while(runningA){ //runningA is a boolean variable, this is always true as long as application is running
conditionA.timedwait(sleepA);
commonActivity();
}
}
finally{
mutexA.release();
}
}
public void myThreadB(){
mutexB.acquire();
try{
while(runningB){ //runningB is a boolean variable, this is always true as long as application is running
conditionB.timedwait(sleepB);
commonActivity();
}
}
finally{
mutexB.release();
}
}
public void myThreadC(){
mutexC.acquire();
try{
while(runningC){ //runningC is a boolean variable, this is always true as long as application is running.
conditionC.timedwait(sleepC);
commonActivity();
}
}
finally{
mutexC.release();
}
}
Q2。 使用timedwait是一个好习惯。我可以通过使用sleep()实现相同的目的。如果使用sleep()调用不好,为什么?
Q3。 有没有更好的方法来做上述事情?
Q4。 每个 condition.timedwait(time); 是否必须具有 condition.signal( )?