Thread Duvida

12 respostas
Deluxe

public class Thsincro extends Thread { public synchronized void run(){ for(int z=0;z<2;z++){ System.out.println(Thread.currentThread().getName()); try{ Thread.sleep(50); }catch(Exception ex){} } } public static void main(String[] args) { Thsincro ts = new Thsincro(); Thsincro tsa = new Thsincro(); ts.setName("TH1"); tsa.setName("TH2"); ts.start(); tsa.start(); }

Alguem sabe pq a primeira vez que eu executo
sai assim?

TH1
TH2
TH2
TH1

e a segunda vez funciona tudo normal

TH1
TH2
TH1
TH2

??

12 Respostas

B

Ola,

A API de thread não garante que a primeira startada será a primeira executada…
depois que vc starta uma thread, elas entram na fila de processamento e partem para a concorrencia…
então, de acordo com a API, a saida de seu programa é indefinida, saca?

Deluxe

mais no exame eu corro o risco desse dipo?
pq quase todos que eu executo a primeira vez da esse tipo de execução, e a segunda vez funciona normal…
ah nao ser quando se tem um loop pra repetir 300 vezes por exemplo, ai sim não é garantido…
vlw

juniormaverick

Deluxe, pelo que lembro de Threads não temos garantia na ordem em que elas irão executar, o que podemos fazer é influenciar o agendador de Threads um exemplo é o metodo estático “sleep()”, mas mesmo com este metodo não temos garantia que as threads irão executar em uma ordem especifica, a unica garantia que temos é que a thread irá ficar em suspensão por algum tempo.

Se vc executar este exemplo que tu listou ai mais vezes você irá ver que a cada momento ele realiza uma saída, talvés você na veja, faz o seguinte aumenta o numero 2 de seu FOR para 500 e roda ele várias vezes para você ver que a cada momento ele tem uma saída.

Vai um exemplo, tenho Thread1 e Thread2, no momento que coloco a Thread1 em suspensão eu não tenho garantia que a Thread2 vai para o estado de execução, caso Thread2 vá para o estado de execução no momento que eu colocar ela no estado de suspensão eu não tenho garantia que a Thread1 que voltou para o estado executável irá entrar no estado de execução, assim a Thread2 pode sair do estado de suspensão e voltar para o estado de executável e selecionada novamente pelo agendador de threads para entrar em execução.

No caso utiliza prioridades e o metodo estático “yield()”, neste caso a intenção é dar chances para todas as threads com mesma prioridade serem executadas, mas este comportamento também não é garantido.

Pessoal caso eu esteja errado me corrijam.

Deluxe

certo…
foi o que eu falei…
mas no exame se cair um tipo de questao dessa
qual das duas eu vo responde?

a primeira execução…?
ou a segunda…?
pq uma questão dessa com o loop que roda 2 vez… sempre sai o mesmo resultado…
só a primeira vez que saiu diferente…
só se eu aumentar pra 100, 200 o loop que nao vai ser garantido… ja fiz os testes.

adriano.ferranti

Se cair alguma questão como essa você pode escolher com certeza:
"A saída não pode ser definida"
Pois como os colegas citaram acima, não há garantias quanto há ordem de execução.

juniormaverick

Cara no meu exame caiu perguntas do tipo, mas as respostas para você escolher é do tipo

  • Irá compilar e executar mas a saída não pode ser prevista

ou então

  • a saida será A B A B ou A B B A

pode ficar tranquilo, quando a saída não for prevista eles de tão a alternativa, ou então de dão a alternativa com a saída mudando.

Deluxe

galera
outra duvida
pq o método yield so é executado corretamente até a prioridade 6
veja:

class Teste extends Thread{
	Teste(String nome){
		super(nome);
	}
	public void run(){
		for(int x=0;x<3;x++){
			System.out.println(Thread.currentThread().getName());
			Thread.yield();
	}
	}
	public static void main(String args[]){
		Teste  t = new Teste ("T1");
		Teste  t2 = new Teste ("T2");
			t.setPriority(6);
			t2.setPriority(6);
		t.start();
		t2.start();
		
	}
}
a saida ai é tudo certinho, ele suspende e da a chance para a outra thread com a mesma prioridade executar. saida:
T1
T2
T1
T2
T1
T2

Agora Veja:

class Teste extends Thread{
	Teste(String nome){
		super(nome);
	}
	public void run(){
		for(int x=0;x<3;x++){
			System.out.println(Thread.currentThread().getName());
			Thread.yield();
	}
	}
	public static void main(String args[]){
		Teste  t = new Teste ("T1");
		Teste  t2 = new Teste ("T2");
			t.setPriority(7);
			t2.setPriority(7);
		t.start();
		t2.start();
		
	}
}

Saida:

T1
T1
T1
T2
T2
T2

ele funciona correto de 1 - 6, e de 7 - 10, ele não executa como deveria
ou eu que devo ta boiando em alguma coisa ai...
ou tem algum problema ai
hehe

ViniGodoy

O Yield dá a chance de outra thread executar.

Mas ele não obriga isso. Quem decide, no final, é sempre o escalonador do sistema operacional… a regra que o pessoal falou ali em cima é de ouro:
Não há quaisquer garantias sobre a ordem que suas threads irão executar

juniormaverick

Cara a questão é que o metodo “yield()” não tem comportamento garantido, ou seja, não é garantido que a Thread em execução irá passar para o estado executável, e irá dar chance para outro Thread, normalmente a thread em execução vai para o estado executável, quando o metodo yield é chamado.

Mas o que pode acontecer é o agendador de threads selecionar a mesma novamente para ser executada, neste caso não temos a garantia que a thread que será selecionada será uma thread que não estava sendo executada, assim a thread que estava no estado de execução e foi para o estado de executável quando o metodo yield foi chamado, poderá ser selecionada novamente para ser executada. Pelo seu resultado é isto que está ocorrendo. Testei este código seu com prioridade 7 e rodou como na sua primeira saída.

Guarda uma coisa thread é ========= comportamento não garantido;

Espero ter ajudado. vc irá fazer a prova de certificação?

Deluxe

eai cara fiz a prova hj e não passei…
eu to de boa…
vo fazer o retake depois…
fiz 48%, so achei uma sacanagem ter + de 20 questoes de drag
e ter questões com sicronizado[], sicronizado e sicronizar, tinha varias questões de drag com essas 3 alternativas… possivelmente o que fez eu reprovar…
questões de io so umas 2
questões de serialização umas 2
regex - 1
token - 0
scaner - 0
eu gostei da prova, tava até confiante, huahua mas fazer oq né…
é bom estudar o teskiller bastante, cai algumas questões parecidas…
ahh questões de classpath e jar… ave maria…

eu fiz a prova sem saber classpath e jar, devo ter perdido umas 2 ou 3 questao eu acho
ahh… não faça a prova sem saber BEMM de collections e genericos, cara isso é um saco, tem que saber bem todos os mapas, listas etc. A parte de thread nao achei tãoo complicada, algumas questão cabeludas e outras ligth como chamar start 2 vezes para a mesma thread. Outra coisa caiu umas 10 questão mais ou menos, sobre teoria, falando sobre (É-UM e TEM-UM)…
minha opinião sobre o livro da kathy, eu odeio esse livro, tem hora que o livro viaja muito… e os exercicios do livro é bom ver eles, mas eu considero os exercicio do livro mais dificieis que da prova…

no mais… é isso
semana q vem eu faço de novo
=)
abraço a todos

LPJava

Deluxe:
eai cara fiz a prova hj e não passei…
eu to de boa…
vo fazer o retake depois…
fiz 48%, so achei uma sacanagem ter + de 20 questoes de drag
e ter questões com sicronizado[], sicronizado e sicronizar, tinha varias questões de drag com essas 3 alternativas… possivelmente o que fez eu reprovar…
questões de io so umas 2
questões de serialização umas 2
regex - 1
token - 0
scaner - 0
eu gostei da prova, tava até confiante, huahua mas fazer oq né…
é bom estudar o teskiller bastante, cai algumas questões parecidas…
ahh questões de classpath e jar… ave maria…

eu fiz a prova sem saber classpath e jar, devo ter perdido umas 2 ou 3 questao eu acho
ahh… não faça a prova sem saber BEMM de collections e genericos, cara isso é um saco, tem que saber bem todos os mapas, listas etc. A parte de thread nao achei tãoo complicada, algumas questão cabeludas e outras ligth como chamar start 2 vezes para a mesma thread. Outra coisa caiu umas 10 questão mais ou menos, sobre teoria, falando sobre (É-UM e TEM-UM)…
minha opinião sobre o livro da kathy, eu odeio esse livro, tem hora que o livro viaja muito… e os exercicios do livro é bom ver eles, mas eu considero os exercicio do livro mais dificieis que da prova…

no mais… é isso
semana q vem eu faço de novo
=)
abraço a todos

Ae deluxe! parabens por sua humildade de postar que nao passou!.. mais abre um topico sobre esse assunto. e dar deixa todo esse relato sobre o exame… tem uma galera aqui no guj estudando… e isso pode ajudar… a galera… e tb receberá opnioes da galera aqui… flw!! :smiley:

H

O que tem que saber basicamente sobre collection e generics? teoria (o que são para que servem…) ou saber como implementar as classes mesmo (Hashmap, Hashtable, etc etc)…

Boa sorte na próxima!

Abraços.

Criado 11 de março de 2008
Ultima resposta 13 de mar. de 2008
Respostas 12
Participantes 7