Re:Duvida com Threads

amigo, creio que ela não esteja falando da Thread de forma independente… e sim de uma Thread com relação a outras Threads…

Não há garantias de funcionamento completamente síncrono entre duas ou mais Threads…

Tenta ler novamente…

Espero que tenha ao menos conseguido entender meu ponto de vista…

[]'s

Deveria ser

Não há garantias de que uma vez que um Thread comece a ser executado,continue sem ser interrompido até sua conclusão.

O livro diz que a o comportamento da execução interna de cada Thread é previsível, porém cada Thread tem um comportamento imprevisível de execução.

Esse comportamento pode variar, de acordo com a máquina que está executando, por exemplo.

FONTE: Livro McGrawHill SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065), Chapter 9: Threads, page 714

^^

É até uma conclusão óbvia. Pense comigo:

Se ao disparar uma Thread, ela executasse até terminar, sem ser interrompida, então qual seria a diferença de uma thread e de uma chamada de método?
Nenhuma. Afinal, a thread disparada monopolizaria o processador, e só retornaria a quem disparou após terminar o processamento. Nada rodou em paralelo.

O processamento multi-threading, com um único processador, funciona por time-sharing. Ou seja, uma thread executa um pedacinho do seu código. Então, o processador pára essa execução e troca para outra thread, que executa outro pedacinho. As duas vão se alternando, executando um pouquinho por vez, até que ambas concluem seu processo algum dia.

Com multiplos processadores, cada thread pode ser jogada a um processador diferente. E a execução efetivamente ocorre em paralelo. Para o código que disparou a thread, não sobra qualquer garantia de quando aquela thread roda, nem quando termina. O método start() da classe Thread retorna imediatamente e, a partir daí, temos dois códigos rodando em paralelo.

Por favor, não “upe” tópicos. Você havia postado a dúvida as 10:00, e já estava upando as 10:20h. Se você for upar, não o faça num período tão curto de tempo, procure explicar melhor sua dúvida ou complementar com algum tipo de informação.

Para garantir que seus tópicos sejam resolvidos mais rapidamente:
a) Procure dar títulos descritivos ao seu tópico. “Dúvida com threads” não diz nada sobre a dúvida em si. Um título melhor poderia ser “Uma thread pode não executar até o final?” ou “Uma thread pode ser interrompida sem aviso?”
b) Procure abrir no fórum certo. Sua dúvida foi aberta em Java Básico, quando threads já é um assunto de Java Avançado. Vou mover o tópico.

[]s e boas postagens.

O viniGodoy esta absolutamente correto. Vou tentar simplificar que tambem tenho dificuldade nisto.
A pergunta do livro é, Qual resultado é possivel. Então nao afirma que nao existam outras possibilidades no resultado.

[code] public class Messager implements Runnable{
public static void main(String … args){

// AQUI ESTÁ A STRING QUE SERÁ IMPRESSA
new Thread(new Messager(“Wallace”)).start();
// AQUI ESTÁ A STRING QUE SERÁ IMPRESSA
new Thread(new Messager(“Gromit”)).start();
}
[/code]

[code] private String name;
public Messager(String name){this.name = name;}

//AQUI ESTA O FUNCIONAMENTO DA THREAD
public void run(){
message(1);
message(2);
}

private synchronized void message(int n){  
System.out.print(name+" - "+n+" ");  
}  
}  [/code]

Agora imagina, tu executou uma linha e tera que vir.:

Wallace -1 ou Gromit -1

como tu nao sabe a ordem em que as linhas será executada se imprimiu anteriormente Wallace -1 so podera aparecer.:

Wallace -2 ou Gromit -1

o numero 2 so será impresso depois de ter imprimido o 1.

Espero que tenha conseguido ajudar.

[quote=charles.eduardo]Agora imagina, tu executou uma linha e tera que vir.:

Wallace -1 ou Gromit -1

como tu nao sabe a ordem em que as linhas será executada se imprimiu anteriormente Wallace -1 so podera aparecer.:

Wallace -2 ou Gromit -1

o numero 2 so será impresso depois de ter imprimido o 1.

Espero que tenha conseguido ajudar.[/quote]

Boa tarde,

Mais eu não tenho garantia de que o 1 será impresso primeiro ou não, certo ?

E outra duvida quanto ao synchronized é que ele não funciona para threads que tentam acessar o mesmo objeto ?

Nesse caso as threads estão acessando objetos diferentes.

Também estou com duvidas :smiley:

Com objetos diferentes não há exclusão mútua. Afinal, elas podem rodar em paralelo, cada uma em seu objeto, livremente.

E, com threads rodando livremente, nunca há qualquer tipo de garantia de ordem.

Vejamos o que não pode acontecer:
a) O número 2 aparecer antes do número 1 numa mesma thread: Embora não haja garantias de que thread rodará em que ordem, é garantido que uma mesma thread não altera sua própria ordem de execução. No programa 1 é impresso antes que 2. Então, para uma mesma thread, 1 será sempre impresso antes do que 2;
b) Haver menos ou mais impressões do que duas por thread: Uma thread roda todos os seus comandos, como um programa normal. Ela não rodará 2 vezes um mesmo comando sem haver um comando de repetição, nem pulará comandos sem haver uma estrutura condicional;

No resto, tudo é válido. Pode parecer:

Gromit 1 Gromit 2 Wallace 1 Wallace 2
Gromit 1 Wallace 1 Gromit 2 Wallace 2
Wallace 1 Gromit 1 Gromit 2 Wallace 2
Gromit 1 Wallace 1 Wallace 2 Gromit 2
Wallace 1 Wallace 2 Gromit 1 Gromit 2
Wallace 1 Gromit 1 Wallace 2 Gromit 2
Wallace 1 Gromit 1 Gromit 2 Wallace 2

E talvez mais alguma que eu tenha esquecido.

A situação seria completamente diferente se, além de synchronized, o método também fosse static. Aí sim, as duas threads estariam sobre o mesmo objeto (Messager.class) e não poderia haver nenhuma daquelas escritas intercaladas. As saídas seriam restritas a:
Gromit 1 Gromit 2 Wallace 1 Wallace 2
Wallace 1 Wallace 2 Gromit 1 Gromit 2

Todo mundo será executado até o fim. O sistema operacional não mata threads do nada.

PS: Claro que isso não é 100% verdade. Ele pode matar se o usuário matar o processo com ctrl+alt+del (no caso do Windows) ou um kill no linux, mas isso está fora do escopo desse tipo de questão, e pode ocorrer mesmo que seu programa não tenha outras threads além da principal.

Pessoal tou estudando pra SCJP e Katy Sierra (310-055 2ª edição) deu um giro na minha cabeça…
Ouvi falar muito bem deste forum…,me ajuda aew que tou precisando muito!!

Na página 391 ela fala isso:

[quote]"Não há garantias de que uma vez que um Thread comece a ser executado,continue até sua conclusão.Ou que um loop será concluído até que outro Thread comece.Não,meu caro.Nada é garantido exceto isso:

Cada Thread será iniciado e executado até a conclusão."[/quote]

Eu tenho ou não tenho garantias que o bicho vai ser executado até a conclusão?E pra piorar ela coloca isso na página 392:

Certo aqui ela já fala que nao tem certeza se eles serão executados…
Esse exercicio me deixou noiadão…

[quote]

public class Messager implements Runnable{ public static void main(String ... args){ new Thread(new Messager("Wallace")).start(); new Thread(new Messager("Gromit")).start(); } private String name; public Messager(String name){this.name = name;} public void run(){ message(1); message(2); } private synchronized void message(int n){ System.out.print(name+" - "+n+" "); } }

Informe quais são os resultados possíveis:

A Wallace-1 Wallace-2 Gromit-1
B Wallace-1 Gromit-2 Wallace-2 Gromit-1
C Wallace-1 Gromit-1 Gromit-2 Wallace-2
D Gromit-1 Gromit-2
E Gromit-2 Wallace-1 Gromit-1 Wallace-2

Resposta C[/quote]

Lá em cima ela fala não tem garantias de um Thread chegar ao fim da execução,nem que ele vai será executado…
Se ele pode ser parado do nada e não voltar a execução ou nunca nem chegar a ser executado as respostas A,D tb não tariam certas?
Alguem por favor me ajuda a enteder quais são as garantias que tenho na execução de varios Threads…
Todos serão executados?
A execução de todos irá até o final?
Ajuda aew namoral =D

UP

Certo,certo,certo…a ordem caotica determinada pelo genrenciador nao e um misterio…
Mas tipo…cada thread executavel vai ter sua exec ate o fim ou ele pode nao ser executado nunca ou parar sua execuçao do nada?
Eu tenho garantido que caoticamente terei todos os Threads executados ate o fim ou nao tenho garantias que eles serao executados?
Pq se eu nao tnho garantia que ele sera executado ate op fim as letras A e D seriam exec provaveis…

ViniGodoy deixa eu ver se entendi…
Todo mundo vai ser executado e ate o final do algoritmo…isso e uma garantia(na ordem caotica do gerenciador)…
Acertei?

Valeu ViniGodoy :stuck_out_tongue: