Pessoal tenho um aplicação em SWing que quando o usuário ativa o botão eu abro uma nova thread que fica lendo uma porta serial e jogando os resultados em um jTextField, isso funciona beleza.
O meu problema é quando o usuário clica para cancelar a leitura em dou um interrupt() na thread demora muito para parar a thread. Na minha máquina de desenvolvimento rola legal mas no cliente demora demais e a máquina é nova.
Alguém tem alguma dica?
Thread demora para dar um interrupt()
11 Respostas
[color=darkblue]
Já tentou usar Destroy ou Stop?
O Destroy está Deprecated
[/color]
public void stop() {
if (thread != null)
thread.stop();
}
http://www.janeg.ca/scjp/threads/ending.html
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
Cara verifiquei aqui e o stop() também está depreciado.
Testei aqui e o problema de lentidão continua.
Muito estranho isso.
[color=darkblue]
Existem outras formas de se fazer isso, depende necessariamente do que você precisa, existem esses métodos também:
wait() - suspende a thread que chamou o
método até que outra thread a acorde ou até
que o tempo especificado como argumento
tenha passado;
[/color]
Exemplo:
synchronized (thread) {
while(true)
thread.wait(1000);
// ele faz a thread dormir em milesegundos
}
[color=darkblue]
notify() - acorda, se existir, alguma thread
que esteja “adormecida” ;
notifyAll() - acorda todas as threads que
estejam “adormecidas”.
[/color]
Cuidado quando for usar interrupt(), wait() - principalmente - e outros métodos que param a thread, podem estar sujeitos a spurious wakeups.
Mais informações sobre isso:
Busca no fórum
Javadoc da Classe Object
Motivo disso: a JVM utiliza algumas rotinas do POSIX, e nele se permite os spurious wakeups.
Para saber mais: Spurious Wakeups (Wikipedia)
Até!
Pessoal o meu problema não é interromper, isso eu já to fazendo o problema é que em 2 micros quando eu vou interromper a aplicação fica parada processando cerca de 5 minutos para depois finalizar a operação.
Queria saber se alguém já passou por este problema.
[color=darkblue]
Esqueci de outro método:
yield() = Suspende a Thread atual e faz
com que passe para o processamento
seguinte
[/color]
http://www.ime.usp.br/~gold/cursos/2004/mac438/threadsEmJava.pdf
No link que eu te passei, ele te conta na parte “Interrupting an I/O operation” como minimizar isso.
Agente ajuda e a galera não lê. Minha segunda-feira já está começando mal. 
Até!
[color=darkblue]
maquiavelbona
Obrigado pelos links. :lol:
[/color]
Eu li sim o que foi postado, o fato é que a rotina “aparentemente” parece funcionar bem, pois são apenas 2 micros que apresentam essa lentidão.
Não se pode esperar o mesmo comportamento/perfomance de duas máquinas distintas, ou uma é o “espelho” da outra? Será que a versão da JVM é igual, equipamento e driver da porta serial é igual? Será que nesses casos em especial, não está havendo o bloqueio da porta?
Em:
Verás que se ele estiver nesse estado de “bloqueado”, Thread.interrupt() fará nada, só parará de executar quando sair desse estado.
Quando se guias pela regra, podes cair nesse problema de que quem está errado é a exceção, sem entender realmente o porque.
Até!