2017-10-16 25 views
0

this 포럼 토론에서 시간 제한을두고 정기적 인 백그라운드 작업을 실행하는 Java ScheduledExecutorService를 중지하는 방법을 발견했습니다.조건에 따라 Java ScheduledExecutorService를 종료하는 방법은 무엇입니까?

필자의 경우 특정 조건이 참일 경우 ScheduledExecutorService를 중지해야합니다. 예를 들어, 카운트가 5를 초과하면 "삐 소리 (beep) {count}"인쇄를 중단하고 싶습니다. 이전에 강조 표시된 예제를이 용도로 사용했습니다. 여기

public class BeeperControl { 
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    private int count; 

    public void beep() { 
     final Runnable beeper = new Runnable() { 
      public void run() { 
       count = count + 1; 
       System.out.println("beep " + count); 

       if (count == 5) { 
        scheduler.shutdown(); 
       } 
      } 
     }; 
     final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
       beeper, 1, 1, SECONDS); 
    } 

    public static void main(String[] args) { 
     BeeperControl bc = new BeeperControl(); 
     bc.beep(); 
    } 
} 

는 I 카운트 5 같으면 체크 한 후 셧다운 ScheduledExecutorService를 행 scheduler.shutdown() 방법을 사용하고있다.

제 질문은 이것이 주어진 시나리오 (예 : ScheduledExecutorService가 실행중인 작업에 의해 종료 됨)에 적합한 지 여부입니다. 그런 시나리오에서 사용할 수있는 더 나은 대안이 있습니까? 그것은 읽기 증가 쓰기 (count = count + 1) 등 count 변수에 오래된 값을 초래할 수 있으므로 다중 스레드 환경에서 변경 가능한 상태 (count 변수)를 사용하여

답변

1

이 일어나고하지 않는 것이 좋습니다.

변수가 count 인 경우 일반 이전 int 대신 AtomicInteger을 사용하는 것이 좋습니다.

public class BeeperControl { 
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    private final AtomicInteger count = new AtomicInteger(0); 

    public void beep() { 
     final Runnable beeper = new Runnable() { 
      public void run() { 
       count.getAndIncrement(); 
       System.out.println("beep " + count); 

       if (count.get() == 5) { 
        scheduler.shutdown(); 
       } 
      } 
     }; 
     final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
       beeper, 1, 1, SECONDS); 
    } 

    public static void main(String[] args) { 
     BeeperControl bc = new BeeperControl(); 
     bc.beep(); 
    } 
} 

실행중인 작업에 의해 ScheduledExecutorService을 종료하면 일어나는 것이다 많은 시나리오에서와 같이 괜찮습니다.