如何根据条件关闭 Java ScheduledExecutorService?
How to shut down a Java ScheduledExecutorService based on a condition?
我在 论坛讨论的时间限制后发现了一种停止运行周期性后台任务的 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 被 运行 任务关闭)这是否是一个好的做法,或者是否有更好的替代方案可以用于这种场景?
不建议在多线程环境中使用可变状态(count
变量),因为它可能会导致 count
变量中的陈旧值作为读取-增量-写入(count = count + 1
) 正在发生。
最好使用 AtomicInteger
而不是 count
变量的普通旧 int
。
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
很好,因为在许多情况下都会发生这种情况。
我在
就我而言,我需要在某个条件为真时停止 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 被 运行 任务关闭)这是否是一个好的做法,或者是否有更好的替代方案可以用于这种场景?
不建议在多线程环境中使用可变状态(count
变量),因为它可能会导致 count
变量中的陈旧值作为读取-增量-写入(count = count + 1
) 正在发生。
最好使用 AtomicInteger
而不是 count
变量的普通旧 int
。
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
很好,因为在许多情况下都会发生这种情况。