Multithreading Parte 2
- parte 2 - Tecnologia em Análise e
Desenvolvimento de Sistemas Profa.: Daniela Costa Terra
Email: daniela.terra@ifmg.edu.br
1
Threads Produtor e Consumidor
(buffer circular)
Quando threads produtoras e consumidoras têm tempos de execução comparáveis (equivalentes) torna-se mais eficiente prover
um buffer com um número extra de posições
Neste caso, os tempos de espera em fila é reduzido, melhorando a eficiência do programa
Se as threads produtoras são muito mais rápidas que as threads consumidoras apenas um buffer de tamanho infinito resolveria
Se as threads consumidoras são muito mais rápidas que as threads produtoras uma única posição no buffer é necessária
2
Produtor e Consumidor em buffer circular
import java.util.concurrent.locks.*; import static java.lang.System.*; public class CircularBuffer { private Lock accessLock = new ReentrantLock(); private Condition canWrite = accessLock.newCondition(); private Condition canRead = accessLock.newCondition(); private int[] buffer = {-1,-1,-1}; private int occupiedBuffers = 0; private int indexWrite = 0; private int indexRead = 0; public void set(int value){ accessLock.lock(); try{ while(occupiedBuffers == buffer.length){ out.println("Buffer Cheio! Produtor em await..."); canWrite.await(); }
3
buffer[indexWrite] = value; indexWrite = (indexWrite + 1) % buffer.length; occupiedBuffers++; displayState("Produtor escreve "+ value); canRead.signal(); }catch(InterruptedException e){
e.printStackTrace();
} finally{ accessLock.unlock();
}
}
4
public int get(){ int readValue = Integer.MIN_VALUE; accessLock.lock(); try{ while (occupiedBuffers == 0){ out.println("Buffer vazio! Consumidor esperando."); canRead.await(); } readValue = buffer[indexRead]; indexRead = (indexRead + 1) % buffer.length; occupiedBuffers--; displayState("Consumidor le "+ readValue); canWrite.signal(); }catch(InterruptedException e){
e.printStackTrace();
} finally{ accessLock.unlock();
}
return readValue;
}
5
public