Multithreading

13 respostas
Joao_Batista

Olá galera!

Olha só, eu tenho uma thread1 que é a interface gráfica do meu aplicativo, em especial as barras de progresso. Tenho uma thread2 que é o que o meu aplicativo faz e esta é observada [extends Observable] pela thread1.
Acontece que eu preciso que a thread1 monitore apenas uma parte da thread2, então eu dou um thread2.suspend(). Então eu passo essa thread2 como parâmetro para uma thread3, que é uma nova interface gráfica, no caso, uma nova janela, que precisa observar o resto da thread2. Então eu dou um thread2.resume() e aí pronto, seria simples e fácil se não fosse pelo fato de que uma NullPointerException é disparada nesse momento. Alguém sabe o que aconteceu?

13 Respostas

ViniGodoy

Vou repetir a máxima que venho dizendo para muita gente no GUJ:
Uma thread não é um objeto.

Tenha isso fixo em mente quando for fazer programação multi-thread.

As threads são as linhas de execução. Existe um objeto que descreve essa linha de execução, mas ele não é a thread em si.

Outra coisa, os métodos suspend() e resume() estão deprecated e não devem ser usados. Para mais informações sobre a razão disso, leia o seguinte artigo, conforme orienta o javadoc:
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

Desculpe não ser mais específico, mas não entendi exatamente o que você quer fazer. Se puder dar mais detalhes, posso te ajudar melhor.

jonataswingeter

Olá.

Coloque o código fonte pro pessoal dar uma olhada.

Você já debugou a Thread3 para saber se ela já não está morta?
Talvez seja necessário Thread3.join() em relação a thread2.

Mas melhor você colocar o código e descrever o problema real, isto é, qual a idéia inicial. Assim poderemos saber se existe uma prática/técnica melhor.

Atenciosamente,

jonataswingeter

Para confirmar que o ViniGodoy disse, veja mais:

http://www.argonavis.com.br/cursos/java/j100/java-5-concurrent.pdf

Joao_Batista

Eu tava pondo o código aqui, mas ele é muito grande, tava todo tabulado e ficou desorganizado, fiquei com medo de vocês não compreenderem, então tô mandando logo o arquivo anexo, aí vocês podem abrir no editor Java de vocês.

  • gui.design.MainWindow inicia o aplicativo;
  • Dêem 50000, mais ou menos como entrada;
  • gui.design.ProcessStatus é o foco das threads e é onde tá dando a merda, coloquei uns comentários onde interessa;
  • thread2 cuida das progressBars e thread3 conta o tempo;
  • core.utils.FireProcess é a meta do programa, ainda está incompleta mas já funciona em parte;
  • core.utils.TimeCounter marca o tempo.

Vou aguardar. Obrigadão!!

ViniGodoy

Ok, logo de cara tem uns ifs que cheiram mal…

Por exemplo, o que você quer com isso?

if (thread2 == null) {
   ...
}
else {
    thread2.resume(); 
}

Vou analisar o resto do código aí posto mais.

ViniGodoy

Uma dica, dá uma olhada aqui:
http://www.guj.com.br/posts/list/49965.java#262464

Joao_Batista

ViniGodoy:
Ok, logo de cara tem uns ifs que cheiram mal…

Por exemplo, o que você quer com isso?

if (thread2 == null) {
   ...
}
else {
    thread2.resume(); //Isso certamente dá em nullpointer exception!
}

Vou analisar o resto do código aí posto mais.

Muito simples:

se thread ainda não começou
crie uma;
senão
continue uma; //a thread já terá sido criada e está pausada

Galera, descupa se o código tá muito amador, mas faz muito pouco tempo que eu programo em Java e só essa semana iniciei o contato com Multithreading ok? Valeu pela força que cês tão dando.

ViniGodoy

Quanto a estar amador ou não, isso não tem problema. Pra isso o forum existe! :slight_smile:

bebad

:cry:
Caras eu não sei quase nada sobre treads, estou precisando muito aprender des de o começo…
Preciso fazer um trampo MultiTread em Oreacle, é muito dificil ??
sera q eu consigo encarar…

valeu

:wink:

ViniGodoy

Dependendo da aplicação sim, dependendo não. Tudo vai depender exatamente do que você tiver que fazer.

Quando estiver estudando o assunto, posta suas dúvidas aqui no GUJ que a gente ajuda a resolver.

Joao_Batista

ViniGodoy:
Vou repetir a máxima que venho dizendo para muita gente no GUJ:
Uma thread não é um objeto.

Tenha isso fixo em mente quando for fazer programação multi-thread.

As threads são as linhas de execução. Existe um objeto que descreve essa linha de execução, mas ele não é a thread em si.

Outra coisa, os métodos suspend() e resume() estão deprecated e não devem ser usados. Para mais informações sobre a razão disso, leia o seguinte artigo, conforme orienta o javadoc:
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

Desculpe não ser mais específico, mas não entendi exatamente o que você quer fazer. Se puder dar mais detalhes, posso te ajudar melhor.

Outra coisa: eu sei que os métodos thread.resume() e thread.suspend() são reprovados, inclusive o Eclipse faz um risco bem ignorante em cima do método. É engraçado, às vezes em vez de pausar a thread, o programa trava geral e só a JVM pra finalizar. Daí então entendi porque esses métodos são “deprecated”. Mas eu tentei usar o método thread.interrupt() e ele não funcionou e eu precisava de alguma coisa que pausasse a thread, entende?

dudaskank

Simples, use um atributo…

Não cheguei a ver o código, mas deve ter algum loop no seu run() certo?

Faça o loop verificar variáveis, mais ou menos assim:

while(run) {
    if (!pause) {
        // faz as coisas
    }
}

Os atributos run e pause são atributos boolean do objeto, e você pode setar via set/get.

:slight_smile:

rafaelt

bebad:
:cry:
Caras eu não sei quase nada sobre treads, estou precisando muito aprender des de o começo…
Preciso fazer um trampo MultiTread em Oreacle, é muito dificil ??
sera q eu consigo encarar…

valeu

:wink:

Pra começar comece a escreve “treads” certo: Thread. :smiley:

Agora vamos lá: esse link tem vários documentos interessantes sobre threads, tudo em pdf, então você vai precisar do adobe reader.

http://www.google.com.br/search?as_q=Thread%2BJava&hl=pt-BR&num=10&btnG=Pesquisa+Google&as_epq=&as_oq=&as_eq=&lr=lang_pt&as_ft=i&as_filetype=pdf&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=&as_rights=&safe=images

Criado 25 de janeiro de 2007
Ultima resposta 29 de jan. de 2007
Respostas 13
Participantes 6