Em um programa Java multithread, o programa inteiro não será encerrado até que todos os threads tenham concluído a execução. (Deve-se notar que a execução de todos os threads não-daemon é concluída; se um thread executar o método System.exit(), o programa também será encerrado.) Às vezes, você deseja abortar a execução de um thread, por exemplo, se você deseja sair do programa ou cancelar uma tarefa que está sendo executada, etc.
Java fornece um mecanismo de interrupção que nos permite interromper explicitamente o thread que desejamos encerrar a execução. Uma característica do mecanismo de interrupção é que podemos verificar se o thread foi interrompido e então decidir se responderemos à solicitação de aborto. O thread também pode ignorar a solicitação de aborto e continuar a execução.
Nesta seção, o programa de exemplo que desenvolvemos criará um thread e, após cinco segundos, usará o mecanismo de interrupção para encerrar o thread à força.
saiba disso
Siga as etapas abaixo para concluir o programa de amostra.
1. Crie uma classe chamada PrimeGenerator e herde a classe Thread. O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública PrimeGenerator estende Thread {
2. Reescreva o método run() e adicione um loop infinito ao método. Dentro do loop, verifique se os números inteiros positivos consecutivos começando em 1 são números primos por meio de cálculo. Se sim, imprima no console. O código é o seguinte:
Copie o código do código da seguinte forma:
@Substituir
execução void pública() {
número longo = 1L;
enquanto (verdadeiro) {
if (isPrime(número)) {
System.out.printf("Número %d /tis Prime.", número);
}
3. Após processar um número, verifique se o thread foi interrompido chamando o método isInterrupted(). Se este método retornar verdadeiro, uma frase será impressa no console e a execução do thread será encerrada. O código é o seguinte:
Copie o código do código da seguinte forma:
if (isInterrupted()) {
System.out.println("O gerador principal foi interrompido");
retornar;
}
número++;
}
}
4. Implemente o método isPrime(), que é usado para determinar se o parâmetro é um número primo. Em caso afirmativo, ele retorna verdadeiro, caso contrário, retorna falso. O código é o seguinte:
Copie o código do código da seguinte forma:
/**
* Determine se o parâmetro é um número primo
*
* @param number O número a ser julgado
* @retornar
*/
private boolean isPrime(número longo) {
se (número <= 2) {
retornar verdadeiro;
}
for (int i = 2; i < número; i++) {
if ((número% i) == 0) {
retornar falso;
}
}
retornar verdadeiro;
}
5. Agora, implemente a classe principal do programa de exemplo, a classe Main e o método main(). O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública Principal {
public static void main(String[] args) {
6. Crie um objeto PrimeGenerator e inicie o thread. O código é o seguinte:
Copie o código do código da seguinte forma:
Tarefa de thread = new PrimeGenerator();
tarefa.start();
7. Aguarde cinco segundos e encerre o thread. O código é o seguinte:
Copie o código do código da seguinte forma:
tentar {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
tarefa.interrupção();
8. Execute o exemplo e visualize os resultados.
sabe por que
Abaixo está um trecho impresso do exemplo de execução do programa. A partir dos caracteres impressos, podemos ver como a thread PrimeGenerator imprime as informações e como encerra sua execução ao detectar que a thread foi interrompida.
Copie o código do código da seguinte forma:
O número 43063 é primo.
O número 43067 é primo.
O número 43093 é primo.
O número 43103 é primo.
O número 43117 é primo.
O Gerador Principal foi Interrompido
Thread possui uma função booleana para indicar se o thread foi interrompido. Quando o método interrupção() é chamado, ele é definido como verdadeiro. O método isInterrupted() retorna o valor atual da propriedade.
sem fim
Thread também possui um método para verificar se o thread foi interrompido: o método estático interrompido(), que pode verificar se o thread em execução no momento foi interrompido.
Copie o código do código da seguinte forma:
Há uma grande diferença entre o método isInterrupted() e o método interrompido(). O primeiro não alterará o valor da propriedade de interrupção do thread, enquanto o último pode definir seu valor como falso; interrompido() é um método estático; é recomendado usar o método isInterrupted() para desenvolvimento diário.
Conforme mencionado anteriormente, um thread pode ignorar a solicitação de interrupção e continuar a execução. Contudo, este não é o resultado que desejamos.
Usar doutrina
Este artigo foi traduzido do "Java 7 Concurrency Cookbook" (D Gua Ge o roubou como "Java7 Concurrency Sample Collection") e é usado apenas como material de aprendizagem. Não pode ser utilizado para quaisquer fins comerciais sem autorização.
Pequeno sucesso
Uma versão completa de todo o código usado no programa de exemplo.
O código completo da classe PrimeGenerator é o seguinte:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* Data: 18/09/2013
* Horário: 11h53
*/
classe pública PrimeGenerator estende Thread {
@Substituir
execução void pública() {
número longo = 1L;
enquanto (verdadeiro) {
if (isPrime(número)) {
System.out.printf("Número %d /tis Prime./n", número);
}
if (isInterrupted()) {
System.out.println("O gerador principal foi interrompido");
retornar;
}
número++;
}
}
/**
* Determine se o parâmetro é um número primo
*
* @param number O número a ser julgado
* @retornar
*/
private boolean isPrime(número longo) {
se (número <= 2) {
retornar verdadeiro;
}
for (int i = 2; i < número; i++) {
if ((número% i) == 0) {
retornar falso;
}
}
retornar verdadeiro;
}
}
O código completo da classe principal
Copie o código do código da seguinte forma:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe3;
importar java.util.concurrent.TimeUnit;
/**
* Data: 18/09/2013
* Horário: 12h33
*/
classe pública Principal {
public static void main(String[] args) {
Tarefa de thread = new PrimeGenerator();
tarefa.start();
tentar {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
tarefa.interrupção();
}
}