| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/02/2007 20:17:03
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline
|
Tenho duas dúvidas sobre Threads:
1) A primeira pergunta é: Qual a melhor forma de se usar Threads?
Conheço três formas:
A primeira cria um objeto da classe Thread, contudo eu não sei usar assim, pq naum tenho como especificar o que eu quero que ela faça (método run), certo?
A segunda, eu estendo da Classe Thread e digo o que o quero que fazer sobrescrevendo o método run()
A terceira eu implemento a interface Runnable, que me obriga a implementar o método run
Qual das três formas é a melhor de implementar threads, e em qual situação?
2) A segunda pergunta é o seguinte, eu optei pela segunda opção(Estender de Thread), e agora eu estou querendo parar a minha Thread, é possível?
Eu poderia mandar ela dormir com o sleep, contudo, o sleep recebe como argumento o tempo em milisegundos, e eu quero que ela durma até segunda ordem, ou seja, até eu mandar ela acordar,
Usei o stop, contudo ele é um metodo depreciado (deprecated), então preferi abdicar dessa solução.
Usei o interrupt, e ele lançou uma java.lang.InterruptedException, tentei tratar essa excessão, mas lançou uma illegalMonitorException, tentei tratar a segunda, mas naum capturou-a
Usei o wait, e ele lançou uma excessão, mas a thread naum parou
Me disseram que eu deveria na minha classe, sobrescrever o metodo interrupt para interromper a thread da minha maneira, mas achei que isso era brabeza
Que que eu faço?
Desculpem pelas duas perguntas, mas quero matar dois coelhos com uma "caixa d'água" só !
obrigado,
abraços
|
Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/02/2007 20:46:59
|
Deh
JavaGuru
![[Avatar]](/images/avatar/bac4cbb6173335e862a1b3df635ee3ba.jpg)
Membro desde: 18/04/2006 23:02:24
Mensagens: 244
Localização: Florianópolis - SC
Offline
|
já reparou que a própria Classe Thread implementa Runnable?
bem, o melhor seria você implementar Runnable, ao invés de dar extends em Thread.. pQ?
Você pode querer dar extends em alguma outra coisa qualquer que quiser.
Sobre como parar as Threads, sabe inglês?
deveria ler esse link da sun, que explica o porque desses métodos se tornarem deprecated, e o que usar no lugar deles!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/02/2007 22:00:04
|
alexvieira
Entusiasta Java
![[Avatar]](/images/avatar/a1af768d3b16885b8eb893d58712c1ea.png)
Membro desde: 03/02/2007 14:00:35
Mensagens: 15
Localização: São Paulo - SP
Offline
|
Sempre prefira implementar uma interface, no caso a Runnable, ao invés de estender uma classe (herança). Lembre-se que o java não permite herança múltipla de classes e se você utilizar neste caso, esta sua classe não poderá herdar de mais ninguém.
Quanto ao fato de parar uma thread, o link indicado pela resposta acima é muito bom. De qualquer maneira, para mim não ficou claro o motivo de você precisar parar a sua thread.
Exemplo de uso de thread:
public class Programa implements Runnable {
private int id;
public void run() {
for (int i = 0; i < 10000000; i++) {
if (i % 1000 == 0 ) {
System.out.println("Programa " + id + " valor: " + i);
}
}
}
// Constructor method
public Programa (int id) {
this.id = id;
}
}
public class Teste {
/**
* @param args
*/
public static void main(String[] args) {
Programa p1 = new Programa(1);
Programa p2 = new Programa(2);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
t1.start();
t2.start();
}
}
Abraços
|
Ximango x = new Ximango();
x.fazerCagada(); |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 11:31:10
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline
|
Ah pessoal, é o seguinte, estou fazendo um trabalho de Sistemas Operacionais onde implemento a questão do produtor e consumidor, tenho um buffer, e o produtor insere numeros aleatorios no buffer e o consumidor lê do buffer, no caso uso duas threads pra fazerem isso.
Isso ta funcionando legal, contudo na interface grafica tem um botao pra iniciar a produção e parar, o que eu gostaria era que quando o usuario quisesse, eu parasse a produção e posteriormente reiniciá-las, olhem o screenshot,
vou dar uma olhada no link,
valeu pessoal
|
| Nome do arquivo |
ProdutorConsumidor.jpg |
Download
|
| Descrição |
|
| Tamanho |
23 Kbytes
|
| Baixado: |
63 vez(es) |
|
Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 11:34:45
|
Deh
JavaGuru
![[Avatar]](/images/avatar/bac4cbb6173335e862a1b3df635ee3ba.jpg)
Membro desde: 18/04/2006 23:02:24
Mensagens: 244
Localização: Florianópolis - SC
Offline
|
Reinicia-las? ou continuar de onde parou?
você poderia usar wait() e notify() para fazer isso, se o objetivo é continuar da onde a Thread parou.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 11:38:45
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline
|
Isso, continuar de onde parou, mas quando eu uso o wait, uma excessão é lançada e elas naum param, olha só a saida do console
Depois do StackTrace da excesão as threads continuam rodando,
|
Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 11:44:49
|
Deh
JavaGuru
![[Avatar]](/images/avatar/bac4cbb6173335e862a1b3df635ee3ba.jpg)
Membro desde: 18/04/2006 23:02:24
Mensagens: 244
Localização: Florianópolis - SC
Offline
|
quando usar "wait()" você tem que possuir o Lock do Objeto, e pode fazer de duas maneiras:
Criando um bloco sincronizado:
ou quando você estiver em um método sincronizado:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 11:53:06
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline
|
Esqueci de dizer, naum posso usar monitores, bloco synchronized, pq seria muito fácil (De acordo com o meu professor), tive que implementar esse conceito de semáforo, onde o buffer controla quem pode acessar o que:
Dessa forma, ainda tem alguma solução para mim?
|
Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 11:57:26
|
Deh
JavaGuru
![[Avatar]](/images/avatar/bac4cbb6173335e862a1b3df635ee3ba.jpg)
Membro desde: 18/04/2006 23:02:24
Mensagens: 244
Localização: Florianópolis - SC
Offline
|
Você tem que fazer o sinal esperar? mudar e etc?
não é meio pouco 50 milisegundos? sendo que 1000 == 1 segundo
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 12:17:15
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline
|
Esse tempo que vc viu não é o tempo de amostragem da produção na tela, o tempo é 1000 milisegundos e na interface grafica o usuario pode aumentar e tudo mais,
esse tempo ae, é o tempo em que a thread vai verificar se o semaforo mudou de estado, tipo se ela naum puder escrever pq a variavel está false, ela espera 50 milisegundos para verificar de novo, pq se o tempo for maior, o buffer pode passar muito tempo vazio, mas o tempo de amostragem é bem maior, vai de 1 a 5 segundos.
O que eu queria era poder usar um "sleep" só que sem argumento de tempo, só que naum existe essa sobrecarga.
Uma péssima solução seria quando o usuário apertar o botao stop, ele parar de mostrar a produção na interface grafica, contudo, tudo continuar ocorrendo em background, é uma péssima solução, mas se eu naum conseguir fazer isso funcionar, vou usá-la.
Então, existe alguma outra forma de eu usar o wait sem estar com blocos sincronizados?
|
Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 12:19:04
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Respondendo a dúvida inicial, acho que o ideal mesmo é extender Runnable.
Isso porque você separa o mecanismo de disparo da Thread, do que deve ser executado na Thread.
Existe, a partir do Java 5, outros métodos de se criar threads, através da classe ExecutorsService. Você mesmo poderia ser tentado a criar um Pool de Threads no futuro, e então, ter extendido uma classe já te traria prejuízos.
Quanto a fazer um botão de pausa. Não tem outro jeito senão com wait.
Coloque em seus produtores e consumidores um atributo pausado. Enquanto este atributo valer true, você deve parar num while do tipo:
Depois, dê um notifyAll no método setPausado:
Note que, mesmo fazendo setPausado(true) pode levar um pequano tempo até que seu código chegue no while e efetivamente pause.
No Java 5 há também classes próprias para implementar a lógica do produtor/consumidor, como a classe CompletionService e LinkedBlockingQueue, que tornam a tarefa ainda mais simples do que usando blocos synchronized.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/02/2007 12:42:08
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline
|
Valeu ViniGodoy, funcionou!
Deh, eu tinha falado que naum podia usar synchronized, mas depois percebi que nau podia usar na questao do produtor e consumidor, eu usando apenas para fazer a animação, valeu cara,
Obrigado pessoal,
|
Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2007 06:43:50
|
Wolf_X
JavaTeenager
![[Avatar]](/images/avatar/3a5b32a30dde157ac0e5e90d1330fe91.jpg)
Membro desde: 18/01/2007 03:01:14
Mensagens: 185
Localização: Vitoria - ES
Offline
|
eu tenho duas duvidas, vcs devem axar idiota, mais ai vai,
1- qdo se cria Threads elas trabalham simultaneamente ou eu devo estipular quem vai trabalhar e qdo?
tipo assim , posso criar 2 Threads q processem simultaneamente a informação ou devo estipular a ordem de processamento , 2- posso enviar variaveis de uma Thread para outra??
obrigado
|
Rodolfo Zacche de Aguiar |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2007 06:57:11
|
nbluis
GUJ Master
![[Avatar]](/images/avatar/f0682320ccbbb1f1fb1e795de5e5639a.jpg)
Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline
|
Cara, cada thread só começa sua execução quando acionado o método start, tu não tem como estipular qual tem mais prioridade, o que tu pode fazer é chamar o método setPriority herdado do objeto Thread, mas com isso tu vai estar sugerindo para a maquina virtual o seu processamento, mas não é certo que ela vá acatar a esta regra. As threas são controladas totalmente pela maquina virtual;
Quanto a passar uma variavel para a outra, talvez se uma tiver a instancia da outra sim, ou utilizando alguns outros macetes para isso, como fazendo métodos estáticos ou utilizando uma outra classe auxiliar para isso.
Até mais....
|
Luis Eduardo Bohrer
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2007 06:58:07
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
uma thread nao conhece a outra quem diz quem vai executar eh um cara chamado agendador quando se falar em threads nao existe GARANTIAS de nada. um exemplo legal: pegue um cd-room e coloque no seu drive qual garantia que vc tem q ele vai parar bloquear o que vc está fazendo para exibir o conteudo do cd? Nada ti garantir isso, agora tem alguns cd's que se vc tiver fazendo alguma coisa vamos dizer digitando um texto ai vc pode ele.. simplesmente ele bloqueia sua tarefa e exibi a tela inicial do cd.. entao threads é isso ai... nada é garantido.. e nesse caso do cd eh prioridades uma threads com maior prioridade sempre vai ta em execução.....Wolf_X.
flw!!
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
|
|