Aprendendo sobre Threads! Ser noob é ser feliz!

[code]public class MinhaThread implements Runnable{
private int i=0;
private Thread runner;
public double soma;

MinhaThread(){ //(2)
if (runner==null){
runner = new Thread(this);
runner.start(); //(3)
}
}

public void run(){ //(4)
while(i<3){
soma+=i++;
}
}
}

class TestaMinhaThread {
public static void main(String[] args) {
MinhaThread obj = new MinhaThread(); //(1)
System.out.println(obj.soma); //(5)
}
}[/code]

Amigos, quando executada a instrução MinhaThread obj = new MinhaThread(); (1), não deveria chamar o método construtor MinhaThread() (2) e automáticamente executar o método run() (4)? Devido a presença da instrução runner.start(); (3) no construtor?

No System.out.println(obj.soma); (5) retorna 0 ao invés de 3. :oops:

:wink:

Deveria isso tudo, mas nada garante que o while corre primeiro que o println e por isso pode acontecer que o println mostre 0 ao inves do numero esperado. A primeira regra para trabalhar com Threads: Não assuma nada.

sergio,

Então poderia exemplificar a maneira correta para chegar aquele resultado?
Também, pode me dar uma dica quanto a maneira mais adequada pra finalizar uma thread?

Obrigado. :wink:

Coloque um join() logo apois iniciar a Thread…

runner.start(); runner.join();

Pessoal… eu terminei de ler sobre threads na apostila da caelum, mas
ainda nao consegui entender pra que serve uma!.. poderiam dar
uma simplificada aew pra vê se eu entendo?

Valeu! :wink:

sergio,

Então poderia exemplificar a maneira correta para chegar aquele resultado?
Também, pode me dar uma dica quanto a maneira mais adequada pra finalizar uma thread?

Obrigado. :wink:[/quote]

Como o jairelton ja disse a forma de esperar é invocar join.
join significa “junta a thread corrente no fim” e é na realidade um wait() especial.

A forma correcta de terminar a thread é runner.interrupt()
Dentro da Thread se ela executa um loop, por exemplo ( que é o mais normal) e invoca sleep , então vc é obrigado a caturar InterruptException.
É com esse mecanismo de interupções que se “fecha” um thread.
NO caso desserro acontecer utilize o break para a thread sair do loop imediatamente (pq é isso que interromper signifca :slight_smile: )

[quote=“Uchiha_Itachi”]Pessoal… eu terminei de ler sobre threads na apostila da caelum, mas
ainda nao consegui entender pra que serve uma!.. poderiam dar
uma simplificada aew pra vê se eu entendo?

Valeu! :wink:[/quote]

Uma não serve para muito … :wink: … várias servem.

uma Thread representa um processo de execução. Uma sequencia de comandos. Mas acontece que muitas vezes é nenessário executar dois ou mais processsos simultaneamente. Então temos que criar várias threads que correm simultaneamente .

Exemplo: Vc lê um arquivo de endereços e grava o banco.
Poderiamos ler todos os endereços e depois gravar todos no banco.
MAs poderiamos também ter uma thread lendo e simultaneamente
uma que escreve. Isto aumenta a velocidade com que o programa faz o mesmo trabalho e diminui a memoria necessária pq não tivemos que ler todos os produtos de uma so vez.
Outro uso é num servidor. Quando o servidor recebe uma requisição ele faz um determinado processo e envia uma resposta ao usuário. Mas como vazer para processar vários usuários simultaneamente ?
A resposta é criar várias threads. Cada uma analizando e respondendo ao seu usuário. Tudo isto, sem que o outro usuário tenha que esperar a sua vez.

Muito esclarecedor! :wink:

Agradeço a todos!

Estou pesquisando uma literatura adicional e exemplos para aprender corretamente.

Os conceitos haviam ficado vagos, pois não avancei no livro que tenho. Há certa dificuldade, pois não sou programador, mas professor do ensino fundamental. Estou levando JAVA à sala de aula, para auxiliar no estudo da matemática.

Após realizar as tarefas, postarei aqui. :grin:

hmmm… agora entendi!
obrigado sergiotaborda! :joia: