Maison >Java >javaDidacticiel >Comment expirer avec précision un thread en Java ?

Comment expirer avec précision un thread en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 00:18:16913parcourir

How to Precisely Timeout a Thread in Java?

Expirer un thread avec précision

Pour établir une limite de temps pour un thread, envisagez d'utiliser ExecutorService plutôt que Timer. ExecutorService offre une solution flexible pour contrôler l'exécution d'un thread dans une durée spécifiée.

Voici un extrait de code affiné utilisant ExecutorService :

import java.util.concurrent.*;

public class ThreadTimeout {

    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();
    }

    static class Task implements Callable<String> {
        @Override
        public String call() throws Exception {
            // Your long-running task should go here.
            return "Ready!";
        }
    }
}

En tirant parti de Future#get(), vous pouvez établir un délai d'attente pour la tâche. Si la tâche se termine dans ce délai, le résultat est récupéré comme prévu. Cependant, s'il ne parvient pas à se terminer dans le temps imparti, le bloc catch est exécuté, vous permettant d'annuler la tâche.

Clarification sur l'utilisation de sleep()

L'inclusion de sleep() dans l'exemple fourni est uniquement à des fins de démonstration. Il est destiné à simuler une tâche de longue durée au sein du SSCCE. Dans votre scénario actuel, remplacez sleep() par la tâche de longue durée souhaitée.

Pour éviter les blocages potentiels, il est crucial de vérifier périodiquement dans la tâche de longue durée si votre thread a été interrompu, comme indiqué dans le extrait de code suivant :

while (!Thread.interrupted()) {
    // Perform your long-running task here.
}

Cette approche méthodique garantira que votre fil répond rapidement aux demandes d'interruption et se termine correctement après l'expiration du délai.

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!

Déclaration:
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