Maison > Java > javaDidacticiel > Comment puis-je implémenter un ExecutorService Interruptible avec des délais d'attente en Java ?

Comment puis-je implémenter un ExecutorService Interruptible avec des délais d'attente en Java ?

Mary-Kate Olsen
Libérer: 2024-12-06 14:34:11
original
271 Les gens l'ont consulté

How Can I Implement an Interruptible ExecutorService with Timeouts in Java?

Service d'exécution interruption avec délais d'attente

Lors de l'exécution de tâches chronophages en parallèle, il est essentiel de contrôler les délais d'attente d'exécution pour éviter que les tâches n'occupent indéfiniment des ressources . Cet article explore les implémentations existantes d'ExecutorServices qui offrent de telles capacités de délai d'attente.

Une solution est un ExecutorService personnalisé, conçu par les contributeurs ci-dessous, qui surveille l'exécution des tâches et interrompt tout dépassement d'un délai d'attente prédéfini :

import java.util.List;
import java.util.concurrent.*;

public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor {
    // Timeout configuration
    private final long timeout;
    private final TimeUnit timeoutUnit;

    // Task and timeout scheduling
    private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor();
    private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<>();

    // Initialize with timeout and scheduling options
    public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
        this.timeout = timeout;
        this.timeoutUnit = timeoutUnit;
    }

    // ExecutorService lifecycle management
    @Override
    public void shutdown() {
        timeoutExecutor.shutdown();
        super.shutdown();
    }

    @Override
    public List<Runnable> shutdownNow() {
        timeoutExecutor.shutdownNow();
        return super.shutdownNow();
    }

    // Monitor task execution and initiate timeouts
    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        if (timeout > 0) {
            final ScheduledFuture<?> scheduled = timeoutExecutor.schedule(new TimeoutTask(t), timeout, timeoutUnit);
            runningTasks.put(r, scheduled);
        }
    }

    // Handle tasks after completion and cancel timeouts
    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        ScheduledFuture timeoutTask = runningTasks.remove(r);
        if (timeoutTask != null) {
            timeoutTask.cancel(false);
        }
    }

    // Task responsible for interrupting long-running tasks
    class TimeoutTask implements Runnable {
        private final Thread thread;

        public TimeoutTask(Thread thread) {
            this.thread = thread;
        }

        @Override
        public void run() {
            thread.interrupt();
        }
    }
}
Copier après la connexion

Cette implémentation personnalisée offre un moyen pratique et efficace de surveiller l'exécution des tâches et d'appliquer des délais d'attente, garantissant ainsi un comportement prévisible des tâches dans les environnements multithread.

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