有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java shutdownNow()然后重新调度ScheduledThreadPoolExecutor:如何?

我正在使用ScheduledThreadPoolExecutor研究按钮单击的调度方法。 如果在执行方法之前再次单击按钮,我希望关闭执行器并重新安排。 我使用boolean和try/catch来实现这一点,但executor似乎只是被关闭了,并没有再次计划

这是我的代码的问题,还是线程处理的本质

下面是我的代码

JAVA

ScheduledTrheadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
se.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
  se.setRemoveOnCancelPolicy(true);

...
if (!clicked) {
  se.schedule(runnable, 10, TimeUnit.SECONDS);
  clicked = true;
} else {
  try {
    se.shutdownNow();
    se.schedule(runnable, 10, TimeUnit.SECONDS);
  } catch (RejectedExecutionExeption e) {
    e.printStackTrace();
  }
}

共 (1) 个答案

  1. # 1 楼答案

    首先在顶部初始化的ScheduledTrheadPoolExecutor se = new ScheduledThreadPoolExecutor(1);行下方设置se.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);

    然后在关闭当前执行器后,重新初始化,如下所示:

        try {
           se.shutdownNow();
          // Previous Executor is terminated, but to re-schedule task again Executor has to be initialized .
           se = new ScheduledThreadPoolExecutor(1);
           se.setRejectedExecutionHandler(new 
           ThreadPoolExecutor.DiscardOldestPolicy());
           se.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
           se.setRemoveOnCancelPolicy(true);
           se.schedule(runnable, 10, TimeUnit.SECONDS);
    
           } catch (Exception e) {
             e.printStackTrace();
        }