Parando Threads

:scrambleup: Coloquei num tópico uma coisa faz pouco tempo (http://www.guj.com.br/forum/viewtopic.php?t=14302) e agora quero ir mais fundo… Pra quem não chegar a ver o tópico que eu postei anteriormente, vou resumir um pouco: eu tenho 3 Threads… Uma main, outra que é uma JDialog com uma JProgressBar dentro e outra que baixa arquivos de um servidor FTP com o commons-net da Jakarta. O que eu quero fazer é parar a 3ª Thread quando eu clicar em Cancelar na JDialog. Já tentei usar

minhaTerceiraThread.interrupt()

e não tenho garantia nenhuma de que o download de arquivos do FTP vai parar (nem na hora que eu clicar e nem quando parar de baixar o arquivo que já estava baixando)… Alguma idéia de como parar esta operação? Assim, em tutoriais fica fácil saber como parar uma Thread se ela estiver dormindo ou esperando alguma coisa… Mas, no meio de uma operação?? Como???

suaThread.stop( );

Porém o método Stop é deprecated.

Dê uma lidinha na DOC da API.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html

Esse é um tutorial básico da sun para threads em java :

http://java.sun.com/docs/books/tutorial/essential/threads/

na parte de life cycle ,
vc enontra justamente o tópico como parar threads, é aconselhável vc entender bem todos os aspectos relacionados, pois mexer com threads
“na mão” pode provocar vários comportamentos instáveis e vc fica perdido.

Atenção, nunca dependa de métodos da classe Thread e do escalonamento da JVM para controlar o ciclo de vida das threads. Cada implementação da JVM usa seu próprio algoritmo e vc nunca tem garantina de quando (ou se) eles vão ser chamados.

:scrambleup: Ok… Acho que você quis dizer pra que a minha classe que extenda Thread ou implemente Runnable deve implemetantar seu “próprio jeito de parar”… Acho que isso é legal sim, mas… Estou usando uma API da Jakarta, a commons-net… Aí complica esse lance de parar… E… Pelo que eu li, o método stop() é deprecated (ou depreciado mesmo, pra aqueles que aceitam a tradução) por motivos relacionados ao estado instável que podem atingir objetos bloqueados por essa Thread… Entendi isso direito? Se entendi, quer dizer que se eu não bloqueei nada com a minha Thread, posso dar stop() nela à vontade?

:arrow: Uma última coisa… Em http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
diz que nos momentos em que interrupt() não funciona, stop() também não funcionaria… Daí, chamar stop() não seria a solução pro meu problema, uma vez que interrupt() não funcionou… Certo?

[quote=“Rubens Fonseca”]Esse é um tutorial básico da sun para threads em java :

http://java.sun.com/docs/books/tutorial/essential/threads/
[/quote]

:scrambleup: Ok… Li a parte de life cicle sobre a qual você falou, Rubens, e vi algo meio assustador pra mim:

Isso significa que um programa que faz downloads nunca pode ser terminado antes de o download acabar, se for uma Thread?? :shock: Assustador! É justamente disso que eu preciso… Parar um download! :cry: Não tem jeito não? :cry: :puppydogeyes: :cry:

Faça assim:

[code]public class TuaThread extends Thread {
public void run() {
//faz o download
}

public void meuMetodoStop() {
//de um jeito de parar seu download
}
}[/code]

E ai vc chama o método meuMetodoStop() para parar a execucao da sua Thread.

:scrambleup: Eu até pensei nisso… Mas não faço idéia de como parar o download… Esse é o problema! Uso o commons-net pra fazer o download e não sei pará-lo… Também não tive outra idéia de como pará-lo no meu código… Oh, meu Deus! :shocked!: Eu criei um monstro!!! :twisted:

Como pará-lo??? :snipersmile: :2gunfire: :evilbat:

Calma, não é tão monstro assim.

O commons-net (FTP) te dá um InputStream, certo? Entonces, esse inputstream pode ser usado como qualquer outro, leia byte a byte escrevendo no seu outputstream (ou seja, fazendo a copia) e entre uma leitura e outra verifique um flag, caso ele te diga que eh pra cancelar vc fecha os streams, remove o arquivo copiado pela metada, etc. etc. e sai bonito da sua função.

Pra vc estar tao desesperado deve ser pq vc tah fazendo a copia como uma só operacao, ai vc nao consegue mesmo limpar e sair direito, mas mude pra usar o InputStream ou OutputStream na unha.

:scrambleup: Não sei… Eu estou usando o método retrieveFile(String, OutputStream) pra pegar cada arquivo… Minhas iterações não são sobre byte mas sobre arquivos em uma lista de arquivos a baixar… Como eu faço para pegar um InputStream? Tá bom que tem um método getInputStream() e um getOutputStream(), mas eles, segundo a documentação:

[quote=“Documentação Jakarta”] :arrow: Returns the Telnet connection InputStream
:arrow: Returns the Telnet connection OutputStream[/quote]

Esses são os In/OutputStreams que eu quero? Telnet mesmo?

Experimenta, Experimenta, Experimenta

[quote=“API do FTPClient”]retrieveFileStream

public InputStream retrieveFileStream(String remote)
throws IOException

Returns an InputStream from which a named file from the server can be read. If the current file type is ASCII, the returned InputStream will convert line separators in the file to the local representation. You must close the InputStream when you finish reading from it. The InputStream itself will take care of closing the parent data connection socket upon being closed. To finalize the file transfer you must call completePendingCommand and check its return value to verify success.[/quote]

:scrambleup: Como diria bunda de puta: [quote=“Bunda de Puta”]Now you got me![/quote] Valeu, señor smota