Q1. ¿Qué es un condVar en Java? Si veo el código a continuación, ¿una variable de condición debe estar necesariamente dentro del bloque 'mutex.acquire()' y 'mutex.release()'?¿Qué es una variable de condición en java?
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();
}
}
I tienen tres hilos myThreadA, myThreadB, myThreadC funcionamiento que llame a la misma función commonActivity() que desencadena la función myWorkReport() por ejemplo
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. Está utilizando el tiempo-espera una buena práctica. Pude haber logrado lo mismo usando sleep(). Si el uso de la llamada de suspensión() es malo, ¿por qué?
Q3. ¿Hay alguna forma mejor de hacer lo anterior?
Q4. ¿Es obligatorio tener condition.signal() por cada condición.tiempo de espera (tiempo);
+1 por qué las variables de condición necesitan mutex.acquire() y release(); – pankajt