プログラムは9枚の印刷後に終了します。
class BeeperControl {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void beep() {
final Runnable beeper = new Runnable() {
public void run() {
System.out.println("beep");
}
};
final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
beeper, 1, 1, SECONDS);
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
}
}, 1 * 9, SECONDS);
}
public static void main(String[] args) {
BeeperControl bc = new BeeperControl();
bc.beep();
}
}
プロセスを停止する方法(つまり、Javaプロセスなど)は、9秒の制限時間後に停止しないため?
あなたが持っている問題は、ビープ音タスクをキャンセルした後、スケジューラがライブスレッドを保持することです。
デーモン以外のライブスレッドがある場合、JVMは存続します。
このスレッドを維持する理由は、次の行でそうするように指示したためです。
_private final ScheduledExecutorService scheduler
= Executors.newScheduledThreadPool(1);
_
newScheduledThreadPool(int corePoolSize)
のドキュメントに注意してください:
corePoolSize
-アイドル状態であっても、プールに保持するスレッドの数。
したがって、JVMを終了させる方法は2つあります。
_0
_を1ではなくnewScheduledThreadPool
に渡します。スケジューラはライブスレッドを保持せず、JVMが終了します。
スケジューラーをシャットダウンします。とにかく、そのリソースを解放するためにそうすることになっています。匿名のrun
のRunnable
を次のように変更します。
_public void run() {
beeperHandle.cancel(true);
scheduler.shutdown();
}
_
(実際、cancel
は必要ありません。shutdown
は次の「ビープ音」が完了するとすぐに有効になります。)