您遇到的问题是,取消哔声任务后,调度程序会保留活动线程。
如果存在活动的非守护程序线程,则JVM保持活动状态。
它使该线程保持不变的原因是您已在此行中告诉它这样做:
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
请注意以下文档
newScheduledThreadPool(int corePoolSize):
corePoolSize-即使在空闲状态下要保留在池中的线程数。
因此,您有两种可能的方法来导致JVM终止:
传递
0
给newScheduledThreadPool
而不是1。调度程序将不保留活动线程,并且JVM将终止。关闭调度程序。无论如何,您应该这样做以释放其资源。因此,将
run
您的匿名帐户更改Runnable
为:public void run() {beeperHandle.cancel(true);scheduler.shutdown();}
(实际上,您不需要
cancel那里-该操作
shutdown将在下一次“提示音”完成后立即生效。)



