Heim >Java >javaLernprogramm >Wie kann ich einen Interruptible ExecutorService mit Timeouts in Java implementieren?

Wie kann ich einen Interruptible ExecutorService mit Timeouts in Java implementieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-06 14:34:11278Durchsuche

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

Unterbrechbarer ExecutorService mit Zeitüberschreitungen

Bei der parallelen Ausführung zeitaufwändiger Aufgaben ist es wichtig, Ausführungszeitüberschreitungen zu kontrollieren, um zu verhindern, dass Aufgaben auf unbestimmte Zeit Ressourcen belegen . In diesem Artikel werden bestehende Implementierungen von ExecutorServices untersucht, die solche Timeout-Funktionen bieten.

Eine Lösung ist ein angepasster ExecutorService, der von den unten aufgeführten Mitwirkenden entwickelt wurde und die Aufgabenausführung überwacht und jede Überschreitung eines vordefinierten Timeouts unterbricht:

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

Diese benutzerdefinierte Implementierung bietet eine bequeme und effiziente Möglichkeit, die Aufgabenausführung zu überwachen und Zeitüberschreitungen durchzusetzen, um ein vorhersehbares Aufgabenverhalten im Multithreading sicherzustellen Umgebungen.

Das obige ist der detaillierte Inhalt vonWie kann ich einen Interruptible ExecutorService mit Timeouts in Java implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn