Maison > Java > javaDidacticiel > Comment définir un délai d'attente pour un thread en Java à l'aide d'ExecutorService ?

Comment définir un délai d'attente pour un thread en Java à l'aide d'ExecutorService ?

Barbara Streisand
Libérer: 2024-12-16 12:55:17
original
608 Les gens l'ont consulté

How to Set a Timeout for a Thread in Java Using ExecutorService?

Comment définir un délai d'attente pour un fil de discussion

Comme soulevé lors de l'enquête initiale, il existe une préoccupation quant à la manière de restreindre l'exécution d'un fil de discussion. temps. L'objectif est de gérer les situations dans lesquelles un thread peut entrer dans une boucle infinie, ce qui entraîne une attente indéfinie du thread parent.

Une solution discutée consiste à utiliser une TimerTask dans la méthode run() du Thread. Cependant, une approche plus efficace consiste à exploiter la classe ExecutorService. Cela fournit un mécanisme pratique pour définir un délai d'attente sur un thread.

Un exemple d'implémentation utilisant ExecutorService peut être illustré comme suit :

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class TimeoutTest {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(4000); // Simulate a long-running task that takes 4 seconds
        return "Ready!";
    }
}
Copier après la connexion

Dans cet exemple, la classe Task encapsule le long- tâche en cours d'exécution. La méthode ExecutorService.submit() est utilisée pour soumettre cette tâche pour exécution. L'objet Future renvoyé par submit() fournit un mécanisme permettant de récupérer le résultat de la tâche.

La méthode Future.get() est appelée avec un argument timeout de 3 secondes. Si la tâche se termine dans ce délai, le résultat est renvoyé. Cependant, si la tâche prend plus de 3 secondes, une TimeoutException est levée. Dans le bloc catch, la tâche est annulée et le message « Terminé ! » Le message est imprimé.

De plus, il est important de noter que dans la tâche de longue durée, une vérification doit être incorporée pour gérer les interruptions, empêchant ainsi la tâche de s'exécuter indéfiniment. Cette vérification peut être implémentée à l'aide de Thread.interrupted().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal