2017-10-16 3 views
0

thisフォーラムディスカッションからの時間制限の後、定期的なバックグラウンドタスクを実行するJava ScheduledExecutorServiceを停止する方法が出てきました。条件に基づいてJava ScheduledExecutorServiceをシャットダウンする方法はありますか?

私の場合、特定の条件が真である場合、私はScheduledExecutorServiceを停止する必要があります。たとえば、カウントが5を超えると、「ビープ音{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(); 
    } 
} 

、私はカウントが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をシャットダウンすると、何が起こるかである多くのシナリオのように細かいです。

関連する問題