Processos Produtor e Consumidor:
É relativamente fácil implementar as classes desses processos, pois a única função que eles tem é chamar um método do Gerenciador da Memória Crítica.
Deve-se observar, porém, que essas classes necessitam herdar características da super-classe Thread, para que os processos possam rodar independentemente. Assim, a classe é declarada com o extends Thread.
Nota: a chamada sleep((int)(Math.random() * csleep)) tem por objetivo fazer o processo dormir por um tempo randômico, em milisegundos, tornando assim a simulação mais "real" e com possibilidade de explorar mais situações.
Ao herdar características da classe Thread, as classes P e C necessitam implementar o método public void run () , que é invocado quando as instâncias dessa classe são iniciadas (através do comando start())
// Classe consumidor, implementada como thread
class
C extends Thread
{
private B buffy; //
indica a área crítica
private int
csleep;
private int
ID; // Identificador desse objeto
public void
run () {
while (this.isAlive())
{ // semelhante a while (true)
buffy.sub(ID); // consome uma unidade
do buffer
try {
sleep((int)(Math.random()
* csleep)); // dorme por um período
randômico
// Simula um desescalonamento
} catch (InterruptedException
e) {
return;
}
}
}
}
// Classe produtor, implementada como thread
class
P extends Thread
{
private B buffy; //
indica a área crítica
private int
psleep;
private int
ID; // Identificador desse objeto
public void
run() {
while (this.isAlive())
{ // semelhante a while (true)
buffy.add(ID); //
consome uma unidade do buffer
try {
sleep((int)(Math.random()
* psleep)); // dorme por um período
randômico
// Simula um desescalonamento
} catch (InterruptedException
e) {
return;
}
}
}
}