该程序在九次打印后完成:
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(); } }
如何停止进程(例如eclipse中的java进程),因为它在9秒内没有停止时间限制?
您遇到的问题是,在您取消蜂鸣声任务后,调度程序会保留一个实时线程.
如果存在实时非守护程序线程,则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
一旦完成下一个"嘟嘟"声就会生效.)