在UI中执行按钮操作时停止ScheduledExecutorService

时间:2019-03-21 16:02:31

标签: java

我已经创建了一个scheduledExecutorService,如下所示

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
  @Override
  public void run() {
    // do stuff
  }
}, 0, 5, TimeUnit.SECONDS);

UIJSP中单击停止按钮后,我想停止服务。对此非常有帮助

3 个答案:

答案 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变量的值:

  

一个布尔值,可以自动更新。