이전에 작업이 완료되지 않은 경우 ScheduledExecutorService
을 사용하여 작업에 대해 여러 스레드를 생성하는 데 관심이 있습니다. 예를 들어 0.5 초마다 파일을 처리해야합니다. 첫 번째 작업은 파일 처리를 시작합니다. 첫 번째 스레드가 완료되지 않은 경우 0.5 초 후 두 번째 스레드가 생성되고 두 번째 파일 처리가 시작됩니다. 이는 같은 것을 수행 할 수 있습니다 :ScheduledExecutorService 병렬 다중 스레드
ScheduledExecutorService executor = Executors.newScheduledThreadPool(4)
while (!executor.isShutdown()) {
executor.execute(task);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// handle
}
}
내 질문 : 왜 executor.scheduleAtFixedRate
함께 할 수없는 이유는 무엇입니까?
첫 번째 작업이 오래 걸리면 두 번째 작업은 처음 완료되면 바로 시작되지만 executor에 스레드 풀이 있어도 새 스레드가 시작되지 않습니다. executor.scheduleWithFixedDelay
은 명확합니다 - 작업이 동일한 시간 간격으로 실행되며 작업을 완료하는 데 걸리는 시간은 중요하지 않습니다. 그래서 아마도 나는 오해를 ScheduledExecutorService
목적으로 생각합니다.
아마도 다른 종류의 집행자를보아야합니까? 아니면 내가 여기 게시 한 코드를 사용합니까? 이견있는 사람?
scheduleAtFixedRate 메소드에 링크했고 javadoc은 "이 태스크의 실행에 기간보다 오래 걸리면 후속 실행이 늦게 시작될 수 있지만 동시에 실행되지는 않습니다." 그게 내가 시도했을 때 작동하는 방법은 정확히 ... scheduleWithFixedDelay는 첫 번째 작업이 끝난 후 지연 계산을 시작하기 때문에 어느 쪽이든 맞지 않습니다. 그리고 스레드 풀이 얼마나 큰지는 중요하지 않습니다. 이것은 ScheduledExecutorService가 병렬 실행을위한 메소드를 가지고 있지 않거나 뭔가를 놓치거나 오해 할 수 있다는 점에서 저에게는 이상합니다. 묻는 이유는 무엇입니까? – nesvarbu
오, 알았습니다. 나는 그것을 놓쳤다. 나는 그 질문이 "당신이 한 번에 두 개를 실행하고 싶다면 정말로 같은 과제입니까?"라고 생각합니다. 확신하고 있다면, java.util.concurrent가 특정 용도를 지원하지 않을 수도 있다고 생각합니다. –