【问题标题】:newScheduledThreadPool(1) creates multiple threadsnewScheduledThreadPool(1) 创建多个线程
【发布时间】:2015-09-06 19:13:47
【问题描述】:

在我的 Java 项目中,我希望每分钟定期做一些事情。调查说这是用

Executors.newScheduledThreadPool(1);

scheduler.scheduleAtFixedRate(runnable, 0, interval, MINUTES);

到目前为止,一切都很好。 执行的任务可能需要比我的间隔长度更多的时间。在这种情况下,新任务应该等待。我以为我是通过将 threadPoolSize 设置为 1 来做到这一点的,但它不起作用。当我的任务需要很长时间并且由于间隔时间结束而应该执行下一个任务时,它只是执行。

谁能告诉我如何让新任务等待之前的任务终止?

【问题讨论】:

  • 请提供一个 mcve。
  • 如果你需要一个线程,那么你不需要线程池。
  • @user5266804 ScheduledExecutorService 不仅仅是一个线程池。就此而言,只有一个工作人员的线程池不仅仅是一个裸线程。他们有做有用事情的方法,你不必(重新)编写它们。重新实现库免费提供的东西是愚蠢的。

标签: java multithreading


【解决方案1】:

根据您的要求使用Executors.newSingleThreadScheduledExecutor(),来自其javadoc:

任务保证按顺序执行。

Timer 和 TimerTask 是您的替代解决方案。

代码示例,“Hi”每 10 秒打印一次,非 1 秒。

public static void main(String[] args) {
   ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
   executor.scheduleWithFixedDelay(new Thr(), 0, 1, TimeUnit.SECONDS);
}

public static class Thr implements Runnable {

   @Override
   public void run() {
      try {
         Thread.sleep(TimeUnit.SECONDS.toMillis(10));
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      System.out.println("Hi");
   }
}

例如,此解决方案将保证您不会意外地在某处重新配置池。 如果使用 newSingleThreadScheduledExecutor() 工厂方法而不是 newScheduledThreadPool(1) 没有帮助 - 很可能您使用另一个执行程序进行调度或类似的事情。看看你的代码,非 Java 执行器或尝试提供mvce

【讨论】:

  • 不幸的是,newSingleThreadScheduledExecutor() 的行为方式似乎相同:/
  • @user2945914 这是不可能的。请提供与 javadoc 行为不一致的完整代码示例。
  • @user2945914 提供了代码示例,可以正常工作并记录在案。
  • 您能解释一下为什么他们目前的解决方案不起作用以及为什么会更好吗?
  • @SotiriosDelimanolis 这个方法的所有内容都在 javadoc 中。 “与其他等效的 {@code newScheduledThreadPool(1)} 不同,返回的执行程序保证不能重新配置以使用其他线程。”如果作者将以这种方式制作执行器,并将使用此执行器进行任务调度而不是另一个执行器 - 它保证重新配置尝试没有副作用。作者没有提供代码示例,所以我不知道他是做什么的。目前的解决方案并不重要,它会起作用。
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 2015-07-13
  • 2010-12-19
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多