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;
            }
        }
    }
}