Thread

5 respostas
ricardolecheta

surgiu um problema de conceito aqui, alguem pode me explicar este programa?

o metodo "print" esta "synchronized" entao uma Thread deveria entrar no metodo de cada vez, mas esta nao eh a impressao que estou tendo...

public class PessoaRunnable implements Runnable
{
	private char nome;

	public PessoaRunnable(char nome)
	{
		this.nome = nome;
	}

	public synchronized void print(char nome, int i)
	{
		try
		{
		    Thread.sleep(500);
		    System.out.println(nome + " : " + i);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}

	public void run()
	{
		for (int i = 0; i < 100; i++)
		{
			print(nome, i);
		}
	}

	public static void main(String[] args)
	{
		Thread t[] = new Thread[5];

		char c = 'a';
		for (int i = 0; i < t.length; i++)
		{
			t[i] = new Thread(new PessoaRunnable(c++));
		}

		for (int i = 0; i < t.length; i++)
		{
			t[i].start();
		}
	}
}

5 Respostas

cariocathi

Qual a impressão que vc está tendo, pq vc acha q o sync nao está funcionando ?

ricardolecheta

se eu faço Thread.sleep(500), não deveria levar um 0.5 segundos entre cada impressão?

por exemplo, uma Thread entra, dorme 0.5 seg e imprime “nome + " : " + i”, mas sempre as Threads imprimem juntas… entende?

sei que é um problema de conceito meu, e não que está acontecendo algo errado…

mas para mim, uma thread deveria imprimir, depois de 0.5 seg outra e assim por diante…

R
Rodei seu programa com um sleep maior e não pareceu-me que os caracteres abcde estão syncronizados com i .Tire fora o synchonized de print e o programa roda igual .Veja o exemplo abaixo onde eu quero sincronizar os parenteses com uma mensagem.
class Parenteses {
     //rode o programa com e sem synchronized.
     synchronized void print(String msg) {
     System.out.print("("+msg);
     try {
           Thread.sleep(1000);
     }catch(InterruptedException ex) {
     System.out.println("Interrompeu");
     }
     System.out.println(")");
    }  }
---------------------------------------------------
    public class ChamaRun implements Runnable {
      String msg;
      Parenteses alvo;
      Thread t;
    public ChamaRun(Parenteses target,String st) {
      alvo=target;
      msg=st
      //O this aqui é uma instancia de ChamaRun e
      //chama run() neste objeto.
      t=new Thread(this);
      t.start();
      }
      public void run() {
      alvo.print(msg);
      }   }
------------------------------------------------
   class Sincronizadora
     public static void main (String args[]) {
         Parenteses alvo= new Parenteses();
         ChamaRun objeto1=newChamaRun(alvo ,"Aqui");
         ChamaRun objeto2=newChamaRun(alvo,"Esta");
         ChamaRun objeto3=new ChamaRun(alvo,"Sincronizado");
         //A thread de main espera as threads terminarem.
         try {
               objeto1.t.join();
               objeto2.t.join();
               objeto3.t.join();
              }
              catch(InterruptedException e) {
              System.out.println("Interrompeu");
           } } }//Adaptado do livro The Complete Reference .5.EDITION
                   //Herbert Schildt -OSBOURN
Espero ter ajudado.
cariocathi

Cara, já entendi seu problema.

É o seguinte:
Há três estados q um programa pode assumir no sistema operacional. Executando, Pronto e Bloqueado. Qnd vc starta as threads, todas elas estão prontas, mas como só é possível executar uma de cada vez elas vao pra fila de prontos e o escalonador escolhe uma pra começar a execução. Ele executa o método e como vc dá um sleep na thread, ela vai para os bloqueados, dando a vez para o próximo da fila. Entendeu ???

Vc starta a thread, ela bloqueia( sleep ) e a proxima executa e tb bloqueia e assim por diante, pra fazer do jeito q vc quer uma letra 0,5s depois da outra, vc deve usar uma thread ou monitores ou semáforos…

Qquer dúvida estamos às ordens

ricardolecheta

entendi, dei uma viajada :slight_smile:

valeu pessoal

Criado 23 de setembro de 2003
Ultima resposta 25 de set. de 2003
Respostas 5
Participantes 3