development

ScheduledExecutorService에서 작업을 제거하는 방법은 무엇입니까?

big-blog 2021. 1. 7. 20:37
반응형

ScheduledExecutorService에서 작업을 제거하는 방법은 무엇입니까?


나는 ScheduledExecutorService몇 가지 다른 작업을 주기적으로 가지고 있습니다.scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);

Runnable이 스케줄러에서 사용 하는 것과 다른 것도 있습니다 . 스케줄러에서 작업 중 하나를 제거하려고 할 때 문제가 시작됩니다.

이를 수행하는 방법이 있습니까?

다른 작업에 하나의 스케줄러를 사용하여 올바른 일을하고 있습니까? 이것을 구현하는 가장 좋은 방법은 무엇입니까?


에서 반환 한 미래를 취소하면됩니다 scheduledAtFixedRate().

// Create the scheduler
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// Create the task to execute
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
};
// Schedule the task such that it will be executed every second
ScheduledFuture<?> scheduledFuture =
    scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS);
// Wait 5 seconds
Thread.sleep(5000L);
// Cancel the task
scheduledFuture.cancel(false);

주의해야 할 또 다른 사항은 취소가 스케줄러에서 작업을 제거하지 않는다는 것입니다. 그것이 보장하는 것은 isDone메소드가 항상 반환 한다는 true입니다. 이러한 작업을 계속 추가하면 메모리 누수가 발생할 수 있습니다. 예 : 일부 클라이언트 활동 또는 UI 버튼 클릭을 기반으로 작업을 시작하는 경우 n 번 반복하고 종료합니다. 해당 버튼을 너무 많이 클릭하면 스케줄러에 여전히 참조가 있으므로 가비지 수집 할 수없는 스레드 풀이 커질 수 있습니다.

당신은 사용할 수 있습니다 setRemoveOnCancelPolicy(true)ScheduledThreadPoolExecutor이후 자바 7에서 사용할 수있는 클래스입니다. 이전 버전과의 호환성을 위해 기본값은 false로 설정됩니다.


ScheduledExecutorService인스턴스가 확장 되면 ThreadPoolExecutor(예 :) ScheduledThreadPoolExecutor사용할 수 있습니다 remove(Runnable)(그러나 javadoc의 참고 : "내부 대기열에 배치되기 전에 다른 양식으로 변환 된 작업을 제거하지 못할 수 있습니다.") 또는 purge().

참조 URL : https://stackoverflow.com/questions/14423449/how-to-remove-a-task-from-scheduledexecutorservice

반응형