Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Melaksanakan Perkhidmatan Pelaksana Interruptible dengan Tamat Masa di 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!