Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Melaksanakan Perkhidmatan Pelaksana Interruptible dengan Tamat Masa di Java?

Bagaimanakah Saya Boleh Melaksanakan Perkhidmatan Pelaksana Interruptible dengan Tamat Masa di Java?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-06 14:34:11278semak imbas

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

Interruptible ExecutorService with Timeouts

Apabila melaksanakan tugas yang memakan masa secara selari, adalah penting untuk mengawal tamat masa pelaksanaan untuk mengelakkan tugas daripada menggunakan sumber yang tidak pasti . Artikel ini meneroka pelaksanaan sedia ada bagi ExecutorServices yang menyediakan keupayaan tamat masa sedemikian.

Satu penyelesaian ialah ExecutorService tersuai, yang direka oleh penyumbang di bawah, yang memantau pelaksanaan tugas dan mengganggu mana-mana yang melebihi tamat masa yang telah ditetapkan:

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

Pelaksanaan tersuai ini menyediakan cara yang mudah dan cekap untuk memantau pelaksanaan tugas dan menguatkuasakan tamat masa, memastikan tingkah laku tugasan boleh diramal dalam persekitaran berbilang benang.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Perkhidmatan Pelaksana Interruptible dengan Tamat Masa di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn