중단 가능한 작업에 대한 시간 제한이 있는 ExecutorService
작업을 동시에 실행할 때 지정된 시간을 초과하는 작업을 정상적으로 중단하는 메커니즘을 갖는 것이 종종 바람직합니다. 시간 초과. 이는 장기 실행 작업으로 인해 애플리케이션이 잠기거나 성능 문제가 발생할 수 있는 상황에서 특히 유용합니다.
TimeoutExecutorService 구현
다음은 TimeoutThreadPoolExecutor를 확장하는 구현입니다. 표준 ThreadPoolExecutor 및 시간 제한 통합 기능:
class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<>(); 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; } // Override methods to implement timeout behavior @Override protected void beforeExecute(Thread t, Runnable r) { if (timeout > 0) { ScheduledFuture scheduled = timeoutExecutor.schedule(new TimeoutTask(t), timeout, timeoutUnit); runningTasks.put(r, scheduled); } } @Override protected void afterExecute(Runnable r, Throwable t) { ScheduledFuture timeoutTask = runningTasks.remove(r); if (timeoutTask != null) { timeoutTask.cancel(false); } } // Timeout task to interrupt threads class TimeoutTask implements Runnable { private final Thread thread; public TimeoutTask(Thread thread) { this.thread = thread; } @Override public void run() { thread.interrupt(); } } }
사용법:
TimeoutThreadPoolExecutor를 사용하려면 간단히 시간 초과 값으로 인스턴스화하면 됩니다.
TimeoutThreadPoolExecutor executor = new TimeoutThreadPoolExecutor( 4, // corePoolSize 8, // maximumPoolSize 1, // keepAliveTime TimeUnit.SECONDS, // timeUnit new LinkedBlockingQueue<>(), // workQueue 5, // timeout TimeUnit.SECONDS // timeoutUnit );
그런 다음 , 다음과 같이 실행자에게 작업을 제출합니다. 평소:
executor.submit(() -> { // long-running task });
작업이 지정된 시간 초과보다 오래 걸리면 작업을 실행하는 스레드가 중단되어 작업이 정상적으로 종료됩니다.
대체 해결 방법
작업에 대한 시간 초과를 구현하는 또 다른 접근 방식은 응답에서 제안된 대로 ScheduledExecutorService를 사용하는 것입니다. 여기에는 작업을 Callable로 제출하고 생성된 미래를 유지하는 것이 포함됩니다. 그런 다음 특정 기간이 지나면 미래를 취소하도록 두 번째 작업을 예약하여 작업을 효과적으로 중단할 수 있습니다.
위 내용은 ExecutorService에서 중단 가능한 작업에 대한 시간 초과를 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!