dúvida em Thread

1 resposta
E

Bem galera, não estou consegui entender porque o método run synchonized não está bloqueando uma outra thread de acessa-lo enquanto tem executando-o.

Meu raciocínio foi esse:

Quando crio duas Thread t1, t2 = new Thread() e passo meu destino o método sincroniza legal. No entando se eu crio duas intâncias que estendem uma Thread e passo o meu destino para as duas o método não é sincronizado. Por que ?

public class Testing123 extends Thread
{
	
	String name;
	
	static Thread t1;
	static Thread t2;
	
	public Testing123(Runnable r,  String name) 
	{
		super(r, name);
	}
	
	public Testing123(String name) 
	{
		this.name = name;
	}
	
	
    public static void main(String... args)
    {    	
    	Testing123 tdestino = new Testing123("Testing123");
    	
    	t1 = new Testing123(tdestino, "Testing1" );    	
    	t2 = new Testing123(tdestino, "Testing2");   	
    	
    	t1.start();	
    	t2.start();
    	
    }    
    
    public synchronized void run() 
    {   	
    	try 
    	{
    		System.out.println(this);
    		
    		String name = Thread.currentThread().getName();
    		
    		System.out.println(name + " iniciando método run!");
    		
    		if(name.equals("Testing1"))
    		{
        		System.out.println(name + " deixando de executar!");
        		
//    			t2.join();
    		}   	
    		
    		Thread.sleep(2000);
    		
			
		} catch (InterruptedException e) 
		{		
			e.printStackTrace();
		}
    	
    	String name = Thread.currentThread().getName();
    	
    	System.out.println(name + " finalizando método run!");
    }
}

1 Resposta

E
public synchronized void run() {
        // comandos
    }

é, para fins de sincronização, equivalente a:

public void run() {
        synchronized (this) {
            // comandos
        }
     }

No seu problema, o “this” é diferente para cada instância de cada thread (t1 e t2), portanto você não vai conseguir sincronizar desse jeito que você está pensando.

Criado 25 de setembro de 2009
Ultima resposta 25 de set. de 2009
Respostas 1
Participantes 2