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
'development' 카테고리의 다른 글
Java에서 두 세트의 교차점을 효율적으로 계산합니까? (0) | 2021.01.07 |
---|---|
OpenCV C ++에서 (Mat) 행렬의 값을 인쇄합니다. (0) | 2021.01.07 |
ConfigureAwait (false)와 Task.Run 사용의 차이점은 무엇입니까? (0) | 2021.01.07 |
Linux 플랫폼 드라이버와 일반 장치 드라이버의 차이점은 무엇입니까? (0) | 2021.01.07 |
Python-TypeError : 'int'개체는 반복 할 수 없습니다. (0) | 2021.01.07 |