The issue you have is that the scheduler keeps a live thread around after you have cancelled the beep task.
If there is a live non-daemon thread, the JVM stays alive.
The reason that it keeps this thread around is that you have told it to do so in this line:
private final ScheduledExecutorService scheduler
= Executors.newScheduledThreadPool(1);
Note the documentation of newScheduledThreadPool(int corePoolSize)
:
corePoolSize
– the number of threads to keep in the pool, even if they are idle.
So, you have two possible ways to cause the JVM to terminate:
-
Pass
0
tonewScheduledThreadPool
instead of 1. The scheduler will not keep a live thread, and the JVM will terminate. -
Shut down the scheduler. You are supposed to do so anyway to release its resources. So change the
run
in your anonymousRunnable
to:public void run() { beeperHandle.cancel(true); scheduler.shutdown(); }
(In fact, you don’t need the cancel
there – the shutdown
will take effect as soon as the next “beep” is completed.)