2016-10-06 4 views
2

예약 된 작업을 일시 중지했다가 다시 시작해야합니다.예약 된 작업 일시 중지 및 다시 시작

작업을 취소하는 많은 코드 예제가 있지만 작업을 다시 시작하거나 다시 시작해야합니다. 이 작업을 수행하는 제안이 표시됩니다.

public void init(){ 
    scheduledTaskExecutor.getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true); 
} 
public void schedule(String id, Runnable task){ 
    ScheduledFuture<?> scheduledFuture = scheduledTaskExecutor.scheduleAtFixedRate(task); 
    runningTaskRegistry.put(id, task); 
} 

public void suspend(String id){ 
    ScheduledFuture<?> scheduledFuture = runningTaskRegistry.get(serviceName); 
    if(scheduledFuture != null){ 
     scheduledFuture.cancel(false); 
     try{ 
      scheduledFuture.get(); 
     } catch (InterruptedException | ExecutionException | CancellationException e){ 
      // I do not want the currently running task finishing after this point 
     } 
    } 
} 

... 그런 다음 다시 시작하지 않고 다시 예약해야합니다.

이렇게하는 것이 가장 좋은 방법입니까?

+0

일반적으로 작업을 다시 예약하는 것이 좋습니다. 마음에 드는 해킹은 [단일 스레드 실행 프로그램] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newSingleThreadScheduledExecutor--)을 사용하는 것입니다. 일시 중지 조건이 거짓이 될 때까지 대기하는 태스크를 전달합니다. – VGR

+0

단일 스레드 실행 프로그램은 여기에 옵션이 없습니다. 실행하기 위해 수십 개의 장기 실행 프로세스가 있으며 그 중 일부는 꽤 오래 실행됩니다. – BTakacs

답변

0

일시 중지 및 다시 시작보다 일정을 선호합니다. 이 작업을 수행하는 방법을 모르기 때문에뿐만 아니라 일시 중지 된 작업이 스레드를 공개하지 않기 때문입니다. 이 시간 동안 해당 executor 스레드는 작업 대기열에서 대기중인 다른 작업이있을지라도 차단하고 아무 작업도 수행하지 않습니다.

중간 결과가 손실되지 않도록 새 작업을 예약하기 전에 다른 대기열에 넣을 수 있습니다. 또한 해당 대기열을 기반으로 일시 중지 및 다시 시작을 구현할 수 있습니다.

+0

나는 실행자 스레드를 차단하는 것이 좋은 해결책이 아니라는 것에 전적으로 동의한다. 방금 executor 자체가 임시 목록으로 제거한 다음 다시 스케줄을 잡을 수 있다고 생각했습니다. :-) Runnable 주위에 래퍼/프록시를 작성하고 일시 중지 및 다시 시작하는 해결책이 있습니다. 스레드를 차단하지 않고 일시 중지되었을 때 원래 실행 파일을 무시함으로써 :-) 최소한의 상용구 코드로 최소한의 오버 헤드가 발생합니다. – BTakacs

+0

@BTakacs 나는 그것이 당신의 과제가 할 일에 중개 결과를 재사용 할 수 있는지에 달려 있다고 생각합니다. 앞에서 언급했듯이, 효율적이고 일시적인 작업과 재개 가능한 작업을 허용하는 구현이 없다는 것을 알고 있습니다. 즉, 스레드는 차단되지 않고 있습니다. [ "BlockingQueue'] (https://docs.oracle.com/javase/8/docs/apc/java/util/concurrent/BlockingQueue.html)를 사용하여 작업을"주차 "하고 선택하는 것이 좋습니다. 다시. 내가 너에게 모범을 보이길 원한다면 알려줘. – beatngu13

관련 문제