Maison >Java >javaDidacticiel >Comment ExecutorService peut-il améliorer la gestion du délai d'expiration des threads sur TimerTask ?

Comment ExecutorService peut-il améliorer la gestion du délai d'expiration des threads sur TimerTask ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-20 05:01:12849parcourir

How Can ExecutorService Improve Thread Timeout Handling Over TimerTask?

Délai d'expiration des threads : approches alternatives

Bien que TimerTask puisse gérer les délais d'attente au sein des threads, ce n'est pas la solution la plus optimale. Envisagez plutôt d'utiliser ExecutorService, car il fournit une approche complète pour la gestion des threads et les délais d'attente.

ExecutorService vous permet de créer une tâche appelable et de la soumettre pour exécution. Une fois soumise, la tâche peut être surveillée via un objet Future. En spécifiant un délai d'attente dans la méthode Future#get(), vous pouvez contrôler la durée pendant laquelle le thread doit s'exécuter avant qu'une exception ne soit levée.

Voici un exemple d'implémentation :

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 Test {
    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 {
        // Replace this with your long-running task.
        Thread.sleep(4000);
        return "Ready!";
    }
}

Dans ce Dans ce scénario, la tâche s'exécute pendant 4 secondes avant de se terminer. Si le délai d'attente est augmenté à 5 secondes, la tâche se terminera sans être terminée. Si le délai d'attente est défini sur une durée plus courte, une TimeoutException sera levée et la tâche sera annulée.

Pour vérifier les interruptions de thread dans la tâche de longue durée, utilisez while (!Thread.interrupted() ) { ... } boucle. Ce faisant, la tâche peut se terminer gracieusement lorsque cela est nécessaire.

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