ホームページ >Java >&#&チュートリアル >Java でタイムアウトのある Interruptible ExecutorService を実装するにはどうすればよいですか?
タイムアウトのある中断可能な ExecutorService
時間のかかるタスクを並行して実行する場合、タスクがリソースを無期限に占有しないように実行タイムアウトを制御することが重要です。この記事では、このようなタイムアウト機能を提供する ExecutorService の既存の実装について説明します。
1 つの解決策は、以下の寄稿者によって考案されたカスタマイズされた ExecutorService です。これは、タスクの実行を監視し、事前定義されたタイムアウトを超えた場合は中断します。
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(); } } }
このカスタム実装は、タスクの実行を監視し、タイムアウトを強制するための便利で効率的な方法を提供し、マルチスレッドでの予測可能なタスクの動作を保証します。環境
以上がJava でタイムアウトのある Interruptible ExecutorService を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。