AULA 6PC
Semáforos
Na aula anterior mostramos o problema do Produtor/Consumidor que pode ser resolvido utilizando um monitor que bloqueia o recurso, permitindo apenas um acesso de cada vez.
Desta vez vamos comentar um pouco sobre semáforos, que permitem um número maior de Thread acessando os recursos.
Um semáforo é uma estrutura de dados que controla o acesso de aplicações aos recursos, baseando-se em um número inteiro, que representa a quantidade de acessos que podem ser feitos. Assim utilizamos semáforos para controlar a quantidade de acesso a determinado recurso.
Na API do Java existe uma implementação de semáforos que faz justamente esse controle. Vamos ver a seguir um exemplo que usa o Semáforo nativo do Java.
Utilizando Semáforos
Primeiro vamos definir uma implementação de Thread que vai utilizar o semáforo. public class ProcessadorThread extends Thread { private int idThread; private Semaphore semaforo; public ProcessadorThread(int id, Semaphore semaphore) { this.idThread = id; this.semaforo = semaphore;
}
}
Definimos inicialmente um identificador para a nossa Thread e uma referência a um semáforo que irá controlar o acesso a essas variáveis.
Agora vamos definir
ProcessadorThread:
os
métodos
da
nossa
Thread,
dentro
da
classe
private void processar() { try {
System.out.println("Thread #" + idThread + " processando");
Thread.sleep((long) (Math.random() * 10000));
} catch (Exception e) {
e.printStackTrace();
}
}
1
Prof.Fábio Rener
Programação Concorrente.
O método processar() apenas faz a thread dormir por algum tempo, simulando o efeito de um processamento longo. private void entrarRegiaoNaoCritica() {
System.out.println("Thread #" + idThread + " em região não crítica"); processar(); }
Este método simula o acesso da Thread em uma região não crítica, ou seja, uma região ao qual não é necessário pedir uma trava. Exibimos o atual estado da Thread, para facilitar o entendimento do progama, e realizamos um processamento qualquer.