2011-07-27 8 views
6

이전에 작업이 완료되지 않은 경우 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 목적으로 생각합니다.

아마도 다른 종류의 집행자를보아야합니까? 아니면 내가 여기 게시 한 코드를 사용합니까? 이견있는 사람?

답변

0

scheduleAtFixedRate 방법 중 하나가 원하는 것입니다. 이전 작업이 완료되지 않은 경우에도 지정된 간격으로 풀의 스레드에서 작업을 시작합니다. 처리를 위해 스레드가 부족한 경우 ThreadPoolExecutor docs에 설명 된대로 풀 크기 제한을 조정하십시오. 그것이 확실히 할 수 있도록, 각 간격에서 빠른 명령 실행

final ScheduledExecutorService service = Executors.newScheduledThreadPool(POOL_SIZE); 

final Runnable command = new SlowRunnable(); 

service.scheduleAtFixedRate(
    new Runnable() { 
     @Override 
     public void run() { 
     service.execute(command); 
     } 
    }, 0, 1, TimeUnit.SECONDS); 

이 예에있을 것이다 1 쓰레드

+1

scheduleAtFixedRate 메소드에 링크했고 javadoc은 "이 태스크의 실행에 기간보다 오래 걸리면 후속 실행이 늦게 시작될 수 있지만 동시에 실행되지는 않습니다." 그게 내가 시도했을 때 작동하는 방법은 정확히 ... scheduleWithFixedDelay는 첫 번째 작업이 끝난 후 지연 계산을 시작하기 때문에 어느 쪽이든 맞지 않습니다. 그리고 스레드 풀이 얼마나 큰지는 중요하지 않습니다. 이것은 ScheduledExecutorService가 병렬 실행을위한 메소드를 가지고 있지 않거나 뭔가를 놓치거나 오해 할 수 있다는 점에서 저에게는 이상합니다. 묻는 이유는 무엇입니까? – nesvarbu

+0

오, 알았습니다. 나는 그것을 놓쳤다. 나는 그 질문이 "당신이 한 번에 두 개를 실행하고 싶다면 정말로 같은 과제입니까?"라고 생각합니다. 확신하고 있다면, java.util.concurrent가 특정 용도를 지원하지 않을 수도 있다고 생각합니다. –

5

는 I 중첩 익명 각 예약 실행에서 실행 가능을 실행함으로써이 문제를 해결 한 다음 간격이 만료되면 완료됩니다. 나머지 POOL_SIZE-1 스레드는 SlowRunnable의 run()을 병렬로 실행하므로 단일 간격의 지속 시간보다 긴 시간이 걸릴 수 있습니다.

코드를 최소화하고 동일한 ScheduledExecutorService를 다시 사용할 때이 솔루션이 마음에 들지만 올바르게 계산되어야하며 모든 컨텍스트에서 사용하지 못할 수 있습니다. SlowRunnable이 POOL_SIZE 작업까지 실행 속도가 느린 경우 함께 예약 된 작업을 실행할 스레드가 없습니다.

또한 간격을 1 TimeUnit.NANOSECONDS로 설정하면 주 실행 가능 파일의 실행 속도가 너무 느려집니다.