Parfois, nous devons interrompre le thread en cours d’exécution à un moment donné. Par exemple, un thread qui vérifie l’état d’un capteur une fois par minute. Le reste du temps, le thread n’a rien à faire. Pendant ce temps, le thread n’a besoin d’utiliser aucune ressource de l’ordinateur. Une fois cette période écoulée et lorsque la machine virtuelle Java planifie le thread, celui-ci continue de s'exécuter. Pour ce faire, vous pouvez utiliser la méthode sleep() de la classe Thread. Cette méthode retarde l'exécution du thread en se mettant en veille, et le paramètre de type entier spécifie le nombre de millisecondes de mise en veille. Lorsque la méthode sleep() est appelée et que le temps de veille est terminé, la machine virtuelle Java alloue du temps d'exécution du processeur au thread, et le thread continuera à s'exécuter.
Une autre façon d’utiliser la méthode sleep() consiste à utiliser les éléments du type d’énumération TimeUnit. Cette méthode utilise la méthode sleep() de Thread pour mettre le thread actuel en veille. Elle peut accepter l'unité de temps spécifiée comme paramètre et la convertir en nombre de millisecondes correspondant.
Dans cette section, nous allons développer un programme qui utilise la méthode sleep() pour imprimer l'heure actuelle chaque seconde.
je le sais
Suivez les étapes indiquées ci-dessous pour mettre en œuvre les exemples de cette section.
1. Créez une classe nommée FileClock et implémentez l'interface Runnable. Le code est le suivant :
Copiez le code comme suit :
la classe publique FileClock implémente Runnable {
2. Implémentez la méthode run(). Le code est le suivant :
Copiez le code comme suit :
@Outrepasser
public void run() {
3. Écrivez une boucle qui parcourt dix fois. À chaque itération, créez un objet Date et imprimez-le sur la console. Ensuite, appelez la méthode sleep() via la propriété SECONDS de TimeUtil pour retarder l'exécution du thread d'une seconde. Je pensais que la méthode sleep() lancerait InterruptedException. Par conséquent, nous devons écrire quelques lignes de code supplémentaires pour intercepter les exceptions. Lorsqu'un thread peut être interrompu, il est toujours préférable de libérer ou de fermer les ressources utilisées dans le thread. Le code est le suivant :
Copiez le code comme suit :
pour (int je = 0; je < 10; i++) {
System.out.printf("%s/n", new Date());
essayer {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("Le FileClock a été interrompu./n");
}
}
4. Nous avons déjà une classe de threads bien implémentée. Maintenant, implémentons la classe principale. Créez une classe nommée FileMain et implémentez la méthode main(). Le code est le suivant :
Copiez le code comme suit :
classe publique FileMain {
public static void main (String[] arguments) {
5. Créez un objet FileClock, puis créez un thread pour effectuer des tâches. Ensuite, démarrez le fil. Le code est le suivant :
Copiez le code comme suit :
horloge FileClock = new FileClock();
Thread thread = nouveau Thread(horloge);
thread.start();
6. Dans le thread principal, appelez la méthode sleep() via la propriété SECONDS de TimeUtil pour attendre cinq secondes. Le code est le suivant :
Copiez le code comme suit :
essayer {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
7. Interrompez le fil FileClock. Le code est le suivant :
Copiez le code comme suit :
thread.interrupt();
8. Exécutez l'exemple et vérifiez l'effet d'exécution.
sais pourquoi
Lorsque vous exécutez ce programme, vous découvrirez comment le programme imprime l'objet date chaque seconde et comment le fil est interrompu.
Lorsque la méthode sleep() est appelée, le thread quittera le CPU et arrêtera l’exécution pendant un certain temps. Pendant ce temps, le thread n’a plus besoin du CPU, celui-ci peut donc effectuer d’autres tâches.
Lorsqu'un thread en veille est interrompu, une InterruptedException sera levée immédiatement au lieu d'attendre la fin de la veille.
sans fin
Dans l'API de concurrence Java, il existe une autre méthode permettant aux threads d'abandonner le processeur. Il s'agit de la méthode rendement(). L'appel de cette méthode envoie un message à la machine virtuelle Java indiquant que le thread peut céder le CPU à d'autres threads. La machine virtuelle Java ne garantit pas de répondre à cette requête. Normalement, cette méthode n'est utilisée que lors du débogage du programme.
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
La version complète de l’exemple de code utilisé dans cette section.
Le code complet de la classe FileClock est le suivant :
package com.diguage.books.concurrencycookbook.chapter1.recipe5;
importer java.util.Date ;
importer java.util.concurrent.TimeUnit ;
/**
* Imprimez la date et l'heure actuelles sur la console toutes les secondes.
* Date : 2013-09-18
* Heure : 23h11
*/
la classe publique FileClock implémente Runnable {
@Outrepasser
public void run() {
pour (int je = 0; je < 10; i++) {
System.out.printf("%s/n", new Date());
essayer {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("Le FileClock a été interrompu./n");
}
}
}
Code complet de la classe FileMain
Copiez le code comme suit :
package com.diguage.books.concurrencycookbook.chapter1.recipe5;
importer java.util.concurrent.TimeUnit ;
/**
* Veille et reprise du fil de démonstration
* Date : 2013-09-19
* Heure : 00h29
*/
classe publique FileMain {
public static void main (String[] arguments) {
horloge FileClock = new FileClock();
Thread thread = nouveau Thread(horloge);
thread.start();
essayer {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}