Problema com threads (requer paciência - mto código =P)

3 respostas
tnaires
Pessoal, estava estudando threads, e me deparei com o seguinte problema: Suponham q eu tenha uma classe assim:
public class Teste
{
        private static Teste instance = new Teste();

        public static Teste getInstance()
        {
                return instance;
        }

        public synchronized void metodo1()
        {
                System.out.println(Thread.currentThread().getName() + " iniciando metodo1()");
                // Faça algo
                System.out.println(Thread.currentThread().getName() + " encerrando metodo1()");
        }
}
Agora, tenho a seguinte Thread:
public class ThreadTeste extends Thread
{
        public ThreadTeste(String nome)
        {
                super(nome);
        }

        public void run()
        {
                Teste t = Teste.getInstance();
                t.metodo1();
        }
}
E, finalmente, tenho a classe-teste:
public class TesteMain
{
        public static void main(String args[])
        {
                Thread t1 = new Thread("t1");
                Thread t2 = new Thread("t2");
                Thread t3 = new Thread("t3");
                Thread t4 = new Thread("t4");
                Thread t5 = new Thread("t5");

                t1.start();
                t2.start();
                t3.start();
                t4.start();
                t5.start();
        }
}
Isso, creio eu, deveria retornar blocos assim:
t1 iniciando metodo1()
        t1 encerrando metodo1()
Entretanto, no meio da execução, ele retorna, por exempo:
t1 iniciando metodo1()
        t2 iniciando metodo1()
        t1 encerrando metodo1()
Ora, se metodo1() ta sincronizado, pq o metodo tá sendo interrompido na metade? Agradeço mto a paciência d analisar o problema, e abraços. P.S. - plataforma linux

3 Respostas

C

Cara, como o método está sincronizado realmente ele deveria aparecer as sequencias “iniciando metodo1()” e “encerrando metodo1()” e não intercalar.
Você tem certeza que não tem algum erro no código?
Você usou exatamente o código que você postou aqui?
Pq se foi, tem um erro no código e não era para aparecer nada na saida do seu programa. Dá uma olhada aqui…

public class TesteMain  
{ 
        public static void main(String args[]) 
        { 
                Thread t1 = new Thread("t1"); 
                Thread t2 = new Thread("t2"); 
                Thread t3 = new Thread("t3"); 
                Thread t4 = new Thread("t4"); 
                Thread t5 = new Thread("t5"); 

                t1.start(); 
                t2.start(); 
                t3.start(); 
                t4.start(); 
                t5.start(); 
        } 
}

Você está criando instâncias da classe Thread e não da sua classe ThreadTeste.

Dá uma conferida se você não está fazendo nada de errado…

Abraço

tnaires
Ih cara, eu tô instanciando ThreadTeste mesmo, é pq postei com pressa o código... Corrigindo:
public class TesteMain 
{
        public static void main(String args[])
        {
                ThreadTeste t1 = new ThreadTeste("t1");
                ThreadTeste t2 = new ThreadTeste("t2");
                ThreadTeste t3 = new ThreadTeste("t3");
                ThreadTeste t4 = new ThreadTeste("t4");
                ThreadTeste t5 = new ThreadTeste("t5");

                t1.start();
                t2.start();
                t3.start();
                t4.start();
                t5.start();
        }
}
Eu usei exatamente o mesmo código q aqui, omitindo alguns q eu substituí pelo comentário "// Faça algo" Apliquei o Singleton só pra ter certeza q estamos falando do mesmo objeto. Abraços
tnaires

Olá
Por favor, tranquem este tópico… :oops:
Executei o mesmo exemplo sem o código omitido pelo comentário, e deu certo. Ele executava um número de conexões ao banco d dados e armazenava numa pilha (Stack). Talvez esse processo interrompa outras threads em execução, ou algo semelhante…
D qq maneira, obrigado pela atenção.

Criado 19 de agosto de 2004
Ultima resposta 19 de ago. de 2004
Respostas 3
Participantes 2