程序在打印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();
}
}如何停止一个进程(例如,eclipse中的java进程),因为它在9秒的时间限制后没有停止?
发布于 2015-12-10 21:32:29
您遇到的问题是,在您取消beep任务之后,调度程序会保留一个活动线程。
如果存在活动的非守护进程线程,则JVM保持活动状态。
它保留这个线程的原因是,您已经在下面这行中告诉它这样做:
private final ScheduledExecutorService scheduler
= Executors.newScheduledThreadPool(1);请注意newScheduledThreadPool(int corePoolSize)的文档
corePoolSize-保留在池中的线程数,即使它们是空闲的。
因此,您有两种可能的方法来终止JVM:
0传递给newScheduledThreadPool,而不是1。调度器将不会保留活动线程,并且JVM将关闭调度器。你无论如何都应该这样做,以释放它的资源。因此,将您的匿名Runnable中的run更改为:public void run() { beeperHandle.cancel(true);scheduler.shutdown();}
(实际上,您不需要cancel - shutdown将在下一次“嘟嘟声”结束时立即生效。)
https://stackoverflow.com/questions/34202701
复制相似问题