Java 在特定时间后执行某些代码

Java 在特定时间后执行某些代码,java,multithreading,Java,Multithreading,我需要在一段特定的时间后执行一项操作(例如,应用程序启动30分钟后,如果应用程序仍在运行) 我的选择是什么?这是否意味着会有一个线程“丢失”等待30分钟过去 理想情况下,在程序启动时,我希望执行以下操作(有意简化),然后不必再考虑它: doIfStillUp( 30, new Runnable() { .... }); 那么,我应该如何实施doIfStillUp(…) 我应该使用计时器任务吗?执行者框架 最重要的是(这是为了理解目的):这是否意味着在30分钟

我需要在一段特定的时间后执行一项操作(例如,应用程序启动30分钟后,如果应用程序仍在运行)

我的选择是什么?这是否意味着会有一个线程“丢失”等待30分钟过去

理想情况下,在程序启动时,我希望执行以下操作(有意简化),然后不必再考虑它:

   doIfStillUp( 30, new Runnable() {
       ....    
   }); 
那么,我应该如何实施doIfStillUp(…)

我应该使用计时器任务吗?执行者框架

最重要的是(这是为了理解目的):这是否意味着在30分钟内会有一个线程在空闲时基本上没有任何损失

如果有一个线程“什么都不做”,这是一个问题吗?如果有10000个线程(我在这里开玩笑)“什么都不做”呢


请注意,我试图理解“全局”,而不是解决特定问题。

您可以在
java.util.Timer
上安排任务。对于所有计时器任务,单个计时器线程将由
java.util.timer
创建,您应该使用。它的javadoc回答了你所有的问题

每个计时器使用一个线程,但计时器按顺序执行多个任务。计时器任务应该非常短。如果不是,考虑使用几个计时器。


当然,如果计时器线程没有任何任务要执行,它将处于空闲状态。一个空闲线程不会消耗任何东西(或几乎任何东西),所以我不担心它。不管怎样,你没有很多选择。10000个线程什么也不做当然是个问题,但这意味着每个任务实例化一个计时器,这是错误的。

内置java计时器是直接解决方案:,长)

框架是一个合理的选择

有一种方法只需要一个可运行时间和一个延迟时间

schedule(Runnable command,
         long delay,
         TimeUnit unit)
这很简单。不一定会有线程阻塞等待您的任务。您可以使用ScheduledThreadPoolExecutor,如上所述,它可以使X个线程随时准备运行计划任务


您可以想象一个数据结构,它保存任务应该运行的时间。单个线程可以监视或设置这些延迟,并且可能在单个线程中监视数千个延迟。当第一次过期时,它将运行任务。可能使用它自己的线程,可能使用线程池中X的1。当添加新任务或现有任务完成时,它将等待最早的时间到达,然后再次启动整个过程。

事实上,
java.util.concurrent
通常优于
java.util.Timer
@Paul Rubel:+1。。。但是,如果我走这条路线(因为它通常比计时器更可取),我在哪里创建执行器?在我的doIfStillUp(…)实现中?或者“执行者”应该由我的程序的几个部分共享/使用,因此我应该将执行者作为参数传递给我的方法,这样我就可以对其进行调度(…)?第二个选择,传递执行者,对我来说似乎更干净。