Maison >Java >javaDidacticiel >Comment puis-je implémenter un mécanisme de délai d'attente pour les tâches en Java à l'aide de Timers et d'ExecutorService ?

Comment puis-je implémenter un mécanisme de délai d'attente pour les tâches en Java à l'aide de Timers et d'ExecutorService ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-25 12:39:09731parcourir

How Can I Implement a Timeout Mechanism for Tasks in Java using Timers and ExecutorService?

Définition d'une minuterie en Java

Cette question portait initialement sur la configuration d'une minuterie pour tenter une connexion à une base de données et lever une exception en cas de problème de connexion surgir. La question clarifiée va plus loin en demandant à un minuteur d'exécuter une tâche pendant une période de temps spécifiée, en lançant une exception si la tâche dépasse cette durée.

Définition d'une minuterie

Pour définir une minuterie, créez un objet java.util.Timer :

Timer timer = new Timer();

Pour exécuter la tâche une fois, planifiez-la en utilisant Timer.schedule() :

timer.schedule(new TimerTask() {
    @Override
    public void run() {
        // Database code here
    }
}, 2*60*1000); // 2 minutes in milliseconds

Pour répéter la tâche à l'intervalle spécifié, utilisez Timer.scheduleAtFixedRate() :

timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        // Database code here
    }
}, 2*60*1000, 2*60*1000);

Mécanisme de délai d'attente

Pour définir un délai d'expiration pour une tâche, utilisez un ExecutorService :

ExecutorService service = Executors.newSingleThreadExecutor();

try {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            // Database task
        }
    };

    Future<?> f = service.submit(r);

    f.get(2, TimeUnit.MINUTES); // attempt the task for 2 minutes
}
catch (InterruptedException e) {
    // Thread interrupted during sleep, wait, or join
}
catch (TimeoutException e) {
    // Took too long!
}
catch (ExecutionException e) {
    // Exception within the Runnable task
}
finally {
    service.shutdown();
}

Ce code s'exécutera normalement si la tâche se termine dans les 2 minutes. Sinon, une TimeoutException sera levée et le thread continuera à s'exécuter jusqu'à ce qu'il rencontre une exception dans la base de données ou la connexion réseau.

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