Generalizacao de Thread

4 respostas
gustavo.gabriel

Pessoal estou implementado uma classe mae para algumas Threads que implementam servicos no meu sistema… Esses servicos podem ser iniciados, interrompidos e finalizados… Utilizo o conceito de singleton para iniciar meus servicos, garantindo que uma unica instancia desse servico esta rodando… Nao tenho muita experiencia com Threads e queria uma opiniao de vcs… Ai vai o codigo…
O metodo abstrato executar seria a implementacao do servico.
[ ]s,
Gustavo.

public abstract class ThreadServico extends Thread {
	
	private static final int EXECUTAR = 1;
	private static final int SUSPENDER = 2;
	private static final int FINALIZAR = 3;
	
	private static int estado = 1;
	private static int intervalo = 1 * 1000;
	
	public void run() {
		synchronized(this) {
		    while (this.getEstado() != ThreadServico.FINALIZAR) {
		        try {
		            Thread.sleep(ThreadServico.intervalo);
	                while (this.getEstado() == ThreadServico.SUSPENDER) {
	                	wait();
	                }
	                this.executar();
		        } catch (InterruptedException e1) {
		        	e1.printStackTrace();
		        }
		    }
		}
	}
	
	protected abstract void executar();
	
	public synchronized void executarServico() {
		this.setEstado(ThreadServico.EXECUTAR);
	}
	
	public synchronized void suspenderServico() {
		this.setEstado(ThreadServico.SUSPENDER);
	}
	
	public synchronized void finalizarServico() {
		this.setEstado(ThreadServico.FINALIZAR);
	}
	
	private synchronized int getEstado() {
		return ThreadServico.estado;
	}
	
	private synchronized void setEstado(int estado) {
		ThreadServico.estado = estado;
		notify();
	}
}

4 Respostas

C

Não entendi por que vc está sincronizando na própria referência da thread, pois quem executa o método run() é sempre ‘this’, portanto desnecessário. Vc deve sincronizar o acesso a recursos externos à thread na implementação do método ‘executar’.
Eu uso notifyAll ao invéz de notify, pois como vc nunca sabe qual waiting thread vai ganhar o lock o ideal é deixar que todas elas tenham esta chance.

gustavo.gabriel

nossa… verdade… que furada !!! na correria, e acabei deixando o synchronized(this)… mas ja retirei ele do codigo…
to com um probleminha o wait que estou utilizando esta dando… java.lang.IllegalMonitorStateException…
porque esta acontencendo isso ???
Tem alguma coisa que eu posso melhorar na minha implementacao, nao to sentindo muita segurança nela… estou usando alguns conceitos que eu nunca havia usado…
Valeu pela ajuda galera…
[ ]s,
Gustavo.

louds

Voce só pode usar wait/notify em objetos que a thread tenha 1 lock. Ou seja, volte com o bloco sincronizado em run().

Outras dicas, não use ThreadServico.FINALIZAR para finalizar que a thread deve parar, use o mecanismo próprio do java que é o Thread.interrupted() (olha a API).

O que o CLAUDIO não procede,quando se usa notify() apenas 1 thread vai sair do estado de sleep, enquanto com notifyAll() todas irão.

gustavo.gabriel

Pera ai pessoal… agora fiquei um pouco confuso…

1- O bloco suncronizado em run estava correto ???
Devo deixar ele como estava… ???

2- Ao inves de setar o estado para SUSPENDER, devo usar o Thread.interrupted(), é isso ???

Tem alguma outra forma de melhorar essa implementacao ???

[]s,
Gustavo

Criado 20 de julho de 2004
Ultima resposta 21 de jul. de 2004
Respostas 4
Participantes 3