Thread: Veja exemplo do maratonista

 
 

public class TestThread2 {

public static void main(String[] args){

Runner maratonista1= new Runner(“Pedro”);

Thread t1 = new Thread(maratonista1, “Instrutor1”);

Thread t2 = new Thread(maratonista1, “Instrutor2”);

t1.start();

t2.start();

}

}

 
 

class Runner implements Runnable {

private String nome;

 
 

public Runner(String nome){

this.nome = nome;

}

 
 

@Override

public void run() {

correndo();

}

 
 

public void correndo(){

System.out.println(Thread.currentThread().getName() +

” fazendo ” + this.nome + ” correr”);

for(int i = 0; i < 20; i ++){

System.out.print(i + “, “);

}

System.out.println();

}

}

Possível output:

Instrutor1 fazendo Pedro correr

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, Instrutor2 fazendo Pedro correr

15, 0, 16, 17, 18, 19,

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,

 
 

 
 

 
 

Veja que o output acima ficou bagunçado pelo fato das Threads terem sido executadas ao mesmo tempo, ou de forma dessincronizada.

 
 

Vamos corrigir isso através da Keyword sinchronized no método correndo, assim apenas uma thread por vez (instrutores) poderá fazer o corredor (classe Runner “pedro”) correr.

 
 

public synchronized void correndo(){

System.out.println(Thread.currentThread().getName() +

” fazendo ” + this.nome + ” correr”);

for(int i = 0; i < 20; i ++){

System.out.print(i + “, “);

}

System.out.println();

}

 
 

Output:

Instrutor1 fazendo Pedro correr

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,

Instrutor2 fazendo Pedro correr

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,

 
 

Veja que neste momento cada thread (instrutor) fez o corredor (classe Runner “pedro”) correr de cada vez.

 
 

 
 

Agora, vamos testar com dois maratonistas (class Runner) ao mesmo tempo e observar o resultado:

 
 

 
 

public class TestThread2 {

public static void main(String[] args){

Runner maratonista1= new Runner(“Pedro”);

Runner maratonista2= new Runner(“Jose”);

Thread t1 = new Thread(maratonista1, “Instrutor1”);

Thread t2 = new Thread(maratonista2, “Instrutor2”);

t1.start();

t2.start();

}

}

 
 

class Runner implements Runnable {

private String nome;

 
 

public Runner(String nome){

this.nome = nome;

}

 
 

@Override

public void run() {

correndo();

}

 
 

public synchronized void correndo(){

System.out.println(Thread.currentThread().getName() +

” fazendo ” + this.nome + ” correr”);

for(int i = 0; i < 20; i ++){

System.out.print(i + “, “);

}

System.out.println();

}        

}

 
 

Possível output:

Instrutor1 fazendo Pedro correr

Instrutor2 fazendo Jose correr

0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,

9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,

 
 

 
 

Neste caso, por mais que o método correndo() seja synchronized, há dois maratonistas diferentes e consequêntemente cada Thread (instrutor) os executa independentemente, por isso o output é bagunçado.

 
 

Anúncios
Esta entrada foi publicada em Threads com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s