2016-09-07 2 views
0

20 초마다 실행되는 작업이 있습니다. 그러나 문제는 작업이 지연되어 중단이 발생할 수 있다는 것입니다.예약 된 스레드가 작업을 완료했는지 확인하는 방법은 무엇입니까?

package client; 

import java.util.concurrent.ScheduledThreadPoolExecutor; 
import static java.util.concurrent.TimeUnit.*; 

import java.util.Date; 

public class Bootstrap 
{ 
    public static void main(String[] args) 
    { 
    addThreadsToPool(); 
    ServiceTest service1 = new ServiceTest(); 
    } 

    public static void addThreadsToPool() 
    { 
    ScheduledThreadPoolExecutor eventPool = new ScheduledThreadPoolExecutor(5); 

    eventPool.scheduleAtFixedRate(new Updater(), 2, 20, SECONDS); 

    try { 
     Thread.sleep(20000); 
    } catch (InterruptedException ignored) { 
    } 
    } 
} 

이 예에서는 클래스 업데이터가 매 20 초마다 실행되지만 업데이터의 실행 시간이 20 초를 초과하면 문제가 발생합니다. Updater가 다음 예약 된 실행 전에 ites 작업을 완료하도록 만드는 방법은 무엇입니까?

+1

'Updater'이 완료되지 않은 경우 _cancel_ Updater을 사용하려면'scheduleAtFixedRate'에 의해 반환 된'Future'를 사용하고'Updater'를 취소에 민감하게 만듭니다 (중단 된 상태에주의를 기울임으로써). 현재 스레드). –

+0

업데이터가 작업을 완료하지 못하면 업데이터를 취소하고 시간을 요소에 곱하여이 작업을 실행하는 데 더 많은 시간을 할당하면 미래 부분에 대해 더 자세히 설명하겠습니까? –

+0

2 개의 Updater 작업이 동시에 실행되지 않도록 하시겠습니까? – Gray

답변

0

업데이터가 20 초 이내에 완료되도록 코드를 작성하는 다른 방법은 없습니다. 엄밀히 말하자면 쓰레드가 CPU에서 스케쥴을 잡을 수 있고, 긴 GC 멈춤이 일어날 수 있기 때문에 불가능하다. 태스크 내부에서 루프를 돌리면 주기적으로 시간을 체크하고 마감 시간에 도달하면 중단 할 수있다.

관련 문제