Java 在特定时间后执行某些代码
我需要在一段特定的时间后执行一项操作(例如,应用程序启动30分钟后,如果应用程序仍在运行) 我的选择是什么?这是否意味着会有一个线程“丢失”等待30分钟过去 理想情况下,在程序启动时,我希望执行以下操作(有意简化),然后不必再考虑它:Java 在特定时间后执行某些代码,java,multithreading,Java,Multithreading,我需要在一段特定的时间后执行一项操作(例如,应用程序启动30分钟后,如果应用程序仍在运行) 我的选择是什么?这是否意味着会有一个线程“丢失”等待30分钟过去 理想情况下,在程序启动时,我希望执行以下操作(有意简化),然后不必再考虑它: doIfStillUp( 30, new Runnable() { .... }); 那么,我应该如何实施doIfStillUp(…) 我应该使用计时器任务吗?执行者框架 最重要的是(这是为了理解目的):这是否意味着在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(…)实现中?或者“执行者”应该由我的程序的几个部分共享/使用,因此我应该将执行者作为参数传递给我的方法,这样我就可以对其进行调度(…)?第二个选择,传递执行者,对我来说似乎更干净。