2017-10-16 160 views
0

我遇到了一種停止運行週期性後臺任務的Java ScheduledExecutorService的方法,時間限制在this論壇討論之後。如何根據條件關閉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(); 
    } 
} 

在此,我已檢查,如果計數等於5,然後採用了scheduler.shutdown()方法來關閉ScheduledExecutorService的。

我的問題是這是否是針對給定方案的一個好方法(因爲ScheduledExecutorService是由正在運行的任務關閉的),還是有更好的方法可以用於這種情況?

回答

1

不建議在多線程環境中使用可變狀態(count變量),因爲它可能導致count變量的陳舊值隨着讀 - 遞增 - 寫入(count = count + 1)發生變化。

如果您使用AtomicInteger而不是簡單的舊int代替count變量,那就太好了。

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是罰款,在許多情況下這是發生了什麼。