> Java > java지도 시간 > ExecutorService에서 중단 가능한 작업에 대한 시간 초과를 어떻게 구현할 수 있습니까?

ExecutorService에서 중단 가능한 작업에 대한 시간 초과를 어떻게 구현할 수 있습니까?

DDD
풀어 주다: 2024-12-11 14:54:11
원래의
865명이 탐색했습니다.

How Can I Implement a Timeout for Interruptable Tasks in an ExecutorService?

중단 가능한 작업에 대한 시간 제한이 있는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿