Dans un programme Java multithread, l'intégralité du programme ne se terminera pas tant que tous les threads n'auront pas terminé leur exécution. (Il convient de noter que l'exécution de tous les threads non-démons est terminée ; si un thread exécute la méthode System.exit(), le programme se terminera également.) Parfois, vous souhaitez abandonner l'exécution d'un thread, par exemple : si vous souhaitez quitter le programme, ou si vous souhaitez annuler une tâche en cours d'exécution, etc.
Java fournit un mécanisme d'interruption qui nous permet d'interrompre explicitement le thread dont nous voulons terminer l'exécution. Une caractéristique du mécanisme d'interruption est que nous pouvons vérifier si le thread a été interrompu, puis décider de répondre ou non à la demande d'abandon. Le thread peut également ignorer la demande d'abandon et poursuivre l'exécution.
Dans cette section, l'exemple de programme que nous avons développé créera un thread et, après cinq secondes, utilisera le mécanisme d'interruption pour mettre fin de force au thread.
je le sais
Suivez les étapes ci-dessous pour terminer l’exemple de programme.
1. Créez une classe nommée PrimeGenerator et héritez de la classe Thread. Le code est le suivant :
Copiez le code comme suit :
la classe publique PrimeGenerator étend le fil {
2. Réécrivez la méthode run() et ajoutez une boucle infinie dans la méthode. Dans la boucle, vérifiez si les entiers positifs consécutifs commençant à 1 sont des nombres premiers par calcul. Si tel est le cas, imprimez sur la console. Le code est le suivant :
Copiez le code comme suit :
@Outrepasser
public void run() {
nombre long = 1L ;
tandis que (vrai) {
if (isPrime(nombre)) {
System.out.printf("Numéro %d /tis Prime.", nombre);
}
3. Après avoir traité un numéro, vérifiez si le thread a été interrompu en appelant la méthode isInterrupted(). Si cette méthode renvoie vrai, une phrase est imprimée sur la console, puis l'exécution du thread est terminée. Le code est le suivant :
Copiez le code comme suit :
si (isInterrupted()) {
System.out.println("Le générateur principal a été interrompu");
retour;
}
numéro++;
}
}
4. Implémentez la méthode isPrime(), qui permet de déterminer si le paramètre est un nombre premier. Si tel est le cas, il renvoie vrai, sinon il renvoie faux. Le code est le suivant :
Copiez le code comme suit :
/**
* Déterminer si le paramètre est un nombre premier
*
* @param number Le nombre à juger
* @retour
*/
booléen privé isPrime (nombre long) {
si (nombre <= 2) {
renvoie vrai ;
}
pour (int i = 2; i < nombre; i++) {
si ((nombre % i) == 0) {
renvoie faux ;
}
}
renvoie vrai ;
}
5. Maintenant, implémentez la classe principale de l’exemple de programme, la classe Main et la méthode main(). Le code est le suivant :
Copiez le code comme suit :
classe publique Principale {
public static void main (String[] arguments) {
6. Créez un objet PrimeGenerator et démarrez le thread. Le code est le suivant :
Copiez le code comme suit :
Tâche de fil = new PrimeGenerator();
tâche.start();
7. Attendez cinq secondes, puis terminez le fil. Le code est le suivant :
Copiez le code comme suit :
essayer {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
tâche.interruption();
8. Exécutez l'exemple et affichez les résultats.
sais pourquoi
Vous trouverez ci-dessous un extrait imprimé de l’exemple d’exécution du programme. À partir des caractères imprimés, nous pouvons voir comment le thread PrimeGenerator imprime les informations et comment terminer son exécution lorsqu'il détecte que le thread est interrompu.
Copiez le code comme suit :
Le numéro 43063 est Prime.
Le numéro 43067 est Prime.
Le numéro 43093 est Prime.
Le numéro 43103 est Premier.
Le numéro 43117 est Premier.
Le générateur principal a été interrompu
Thread a une fonction booléenne pour indiquer si le thread a été interrompu. Lorsque la méthode interruption() est appelée, elle est définie sur true. La méthode isInterrupted() renvoie la valeur actuelle de la propriété.
sans fin
Thread dispose également d'une méthode pour vérifier si le thread est interrompu : la méthode statique interrompue(), qui peut vérifier si le thread en cours d'exécution est interrompu.
Copiez le code comme suit :
Il existe une grande différence entre la méthode isInterrupted() et la méthode interrompu(). Le premier ne modifiera pas la valeur de la propriété indiquant si le thread est interrompu, tandis que le second peut définir sa valeur sur false. interrompu() est une méthode statique ; il est recommandé d'utiliser la méthode isInterrupted() pour le développement quotidien.
Comme mentionné précédemment, un thread peut ignorer la demande d'interruption et poursuivre l'exécution. Cependant, ce n’est pas le résultat que nous souhaitons.
Utiliser la doctrine
Cet article est traduit du "Java 7 Concurrency Cookbook" (D Gua Ge l'a volé sous le nom de "Java7 Concurrency Sample Collection") et n'est utilisé que comme matériel d'apprentissage. Il ne peut être utilisé à des fins commerciales sans autorisation.
Petit succès
Une version complète de tout le code utilisé dans l'exemple de programme.
Le code complet de la classe PrimeGenerator est le suivant :
package com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* Date : 2013-09-18
* Heure : 11h53
*/
la classe publique PrimeGenerator étend le fil {
@Outrepasser
public void run() {
nombre long = 1L ;
tandis que (vrai) {
if (isPrime(nombre)) {
System.out.printf("Numéro %d /tis Prime./n", nombre);
}
si (isInterrupted()) {
System.out.println("Le générateur principal a été interrompu");
retour;
}
numéro++;
}
}
/**
* Déterminer si le paramètre est un nombre premier
*
* @param number Le nombre à juger
* @retour
*/
booléen privé isPrime (nombre long) {
si (nombre <= 2) {
renvoie vrai ;
}
pour (int i = 2; i < nombre; i++) {
si ((nombre % i) == 0) {
renvoie faux ;
}
}
renvoie vrai ;
}
}
Le code complet de la classe Main
Copiez le code comme suit :
package com.diguage.books.concurrencycookbook.chapter1.recipe3;
importer java.util.concurrent.TimeUnit ;
/**
* Date : 2013-09-18
* Heure : 12h33
*/
classe publique Principale {
public static void main (String[] arguments) {
Tâche de fil = new PrimeGenerator();
tâche.start();
essayer {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
tâche.interruption();
}
}