我已经创建了一个scheduledExecutorService
,如下所示
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// do stuff
}
}, 0, 5, TimeUnit.SECONDS);
在UI
或JSP
中单击停止按钮后,我想停止服务。对此非常有帮助
答案 0 :(得分:0)
ScheduledFuture::cancel
呼叫ScheduledExecutorService::scheduleAtFixedRate
时,您会返回ScheduledFuture
。当前,您的代码将忽略该返回的对象,并将其删除。
更改代码以捕获计划的将来对象。
ScheduledFuture future = exec.scheduleAtFixedRate(…
ScheduledFuture
的方法可以cancel进行任务,并询问任务是否is already cancelled。
答案 1 :(得分:0)
看看执行器的shutdownNow()
方法。
exec.shutdownNow();
exec.awaitTermination();
它几乎完成您想要的。它不会立即停止线程(因为它不安全)。而是设置isInterrupted()
标志来通知正在停止的正在运行的线程。因此,您的Runnable
必须不时检查该标志。并且当发现标志已设置时,它应该从run()
方法返回。
exec.awaitTermination();
正在等待线程停止。在那一行之后,您可以确定线程已停止执行。
答案 2 :(得分:0)
创建一个带有标志变量的类。 检查该标志的值,并在需要时停止线程。
public class MyRunnable implements Runnable {
private AtomicBoolean running = new AtomicBoolean(true);
public void run() {
while (running.get()) {
...
}
}
public void stopMe() {
running.set(false);
}
}
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
MyRunnable myRunnable = new MyRunnable();
exec.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);
...
myRunnable.stopMe();
注意:请使用AtomicBoolean
,以确保在多线程环境中没有副作用设置并检查running
变量的值:
一个布尔值,可以自动更新。