Na programação Java multithread, o tipo java.lang.Thread contém uma série de métodos start(), stop(), stop(Throwable) e suspend(), destroy() e resume(). Através desses métodos, podemos realizar operações convenientes em threads, mas entre esses métodos, apenas o método start() é retido.
As razões para abandonar esses métodos são explicadas em detalhes em um artigo da Sun "Por que Thread.stop, Thread.suspend e Thread.resume estão obsoletos?"
Se você realmente precisar encerrar um thread, poderá usar os seguintes métodos:
1. Deixe o método run() do thread terminar a execução e o thread terminar naturalmente. (Este método é o melhor)
2. Encerre o thread pesquisando e compartilhando bits de sinalizador, como while(flag){}, o valor inicial do sinalizador é definido como verdadeiro e, quando precisar ser encerrado, defina o valor do sinalizador como falso. (Este método também não é muito bom, porque se o método while(flag){} for bloqueado, o sinalizador se tornará inválido)
parada booleana volátil privada = falso;
public void terminar() {
parar = verdadeiro;
}
execução void pública() {
enquanto(parar) {
// ... algumas declarações
}
}
}
Se o thread entrar no estado Not Runnable devido à execução de sleep() ou wait(), se for wait(), não funcionará se o bit de sinalização for usado.
espera nula final pública (tempo limite longo)
lança InterruptedException Este método faz com que o thread atual (chame-o de T) se coloque no conjunto de espera do objeto e então abandone todos os requisitos de sincronização neste objeto. Ou seja, o thread atual se torna um estado de espera
Uso padrão de wait()
sincronizado(obj){
while(<condição não atendida>){
obj.wait();
}
Processo de processamento que satisfaz as condições
}
E você quer parar com isso, você pode usar o terceiro, ou seja,
3. Use interrupção() e o programa lançará uma exceção InterruptedException, fazendo com que o thread de execução saia do método run().
Por exemplo:
classe pública SomeThread {
público estático void principal(String[] args)
{
Thread thread=new Thread(new Runnable(){
execução void pública() {
enquanto (!Thread.interrupted()) {
// Processa o trabalho a ser processado
tentar {
System.out.println("ir dormir");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("fui interrompido!");
}
});
thread.start();
thread.interrupt();
}
}
Vá dormir
estou interrompido!