Java newScheduledThreadPool(1)创建多个线程

Java newScheduledThreadPool(1)创建多个线程,java,multithreading,Java,Multithreading,在我的Java项目中,我希望每分钟都定期完成一些事情。调查称,这是与 Executors.newScheduledThreadPool(1); 及 到目前为止,一切顺利。 执行任务所需的时间可能超过我的时间间隔长度。在这种情况下,新任务应该等待。我以为我是通过将threadPoolSize设置为1来实现的,但它不起作用。当我的任务需要很多时间,并且由于间隔时间已过而应该执行下一个任务时,它只是执行 有人能告诉我如何让新任务等待较早的任务终止吗?根据您的要求使用执行器。newSingleThre

在我的Java项目中,我希望每分钟都定期完成一些事情。调查称,这是与

Executors.newScheduledThreadPool(1);

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


有人能告诉我如何让新任务等待较早的任务终止吗?

根据您的要求使用执行器。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()
factory方法而不是
newScheduledThreadPool(1)
没有帮助-很可能是使用另一个执行器进行调度或类似的操作。查看您的代码,非Java执行器或尝试提供。

使用
执行器。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()
factory方法而不是
newScheduledThreadPool(1)
没有帮助-很可能是使用另一个执行器进行调度或类似的操作。查看您的代码,非Java执行器或尝试提供。

使用
执行器。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()
factory方法而不是
newScheduledThreadPool(1)
没有帮助-很可能是使用另一个执行器进行调度或类似的操作。查看您的代码,非Java执行器或尝试提供。

使用
执行器。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()
factory方法而不是
newScheduledThreadPool(1)
没有帮助-很可能是使用另一个执行器进行调度或类似的操作。请查看您的代码、非Java执行器或尝试提供。

不幸的是,newSingleThreadScheduledExecutor()的行为方式似乎与之相同:/@user2945914这是不可能的。请提供与javadoc行为不一致的完整代码示例。@user2945914提供的代码示例,按其应有的方式工作并记录在案。您能解释一下为什么他们当前的解决方案不起作用以及为什么这样更好吗?@SotiriosDelimanolis此方法的所有内容都在javadoc中。“与其他等价的{@code newScheduledThreadPool(1)}不同,返回的执行器保证不可重新配置以使用其他线程。”如果作者将以这种方式创建执行器,并将此执行器用于任务调度,而不是另一个任务调度,则它保证重新配置尝试不会产生任何副作用。作者并没有提供代码示例,所以我不知道他是做什么的。使用当前解决方案并不重要,它只会起作用。不幸的是,newSingleThreadScheduledExecutor()的行为似乎与此相同:/@user2945914这是不可能的。请提供与javadoc行为不一致的完整代码示例。@user2945914提供的代码示例,按其应有的方式工作并记录在案。您能解释一下为什么他们当前的解决方案不起作用以及为什么这样更好吗?@SotiriosDelimanolis此方法的所有内容都在javadoc中。“与其他等价的{@code newScheduledThreadPool(1)}不同,返回的执行器保证不可重新配置以使用其他线程。”如果作者将以这种方式创建执行器,并将此执行器用于任务调度,而不是另一个任务调度,则它保证重新配置尝试不会产生任何副作用。作者并没有提供代码示例,所以我不知道他是做什么的。使用当前解决方案并不重要,它只会起作用。不幸的是,newSingleThreadScheduledExecutor()的行为似乎与此相同:/@user2945914这是不可能的。请提供与javadoc行为不一致的完整代码示例。@user2945914提供的代码示例,按其应有的方式工作并记录在案。您能解释一下为什么他们当前的解决方案不起作用以及为什么这样更好吗?@SotiriosDelimanolis此方法的所有内容都在javadoc中。“与其他等价的{@code newScheduledThreadPool(1)}不同,返回的执行器保证不可重新配置以使用其他线程。”如果作者将以这种方式创建执行器,并将此执行器用于任务调度,而不是另一个任务调度,则它保证重新配置尝试不会产生任何副作用。作者并没有提供代码示例,所以我不知道他是做什么的。使用当前解决方案并不重要,它只会起作用