java.util.Timer. timer.schedule()队列的池大小是多少?



可以安排多少任务稍后调用&这有限制吗?我没有看到任何指定的最大限制。例如:是否可以将1000000个任务安排在10小时后执行。我将对它们进行调度,只是通过将它们添加到队列中来延迟任务的执行。

理论上你可以安排无限量的TimerTask-Timer将任务存储在TimerTask数组中,如果它被填满,则其大小将增加一倍(https://github.com/AdoptOpenJDK/openjdk-jdk8u/blob/master/jdk/src/share/classes/java/util/Timer.java#L596)。

但是请注意,Timer只使用一个后台线程来执行所有计划任务(https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html):

)

与每个Timer对象相对应的是一个单独的后台线程,用于依次执行所有Timer的任务。

所以如果你安排数千个任务同时运行,它们是顺序执行的。


注意,线程处于睡眠状态(不是忙于等待下一个调度时间到来)。这意味着在10小时内调度1_000_000TimerTaskTimer将不需要任何CPU资源,直到10小时过去(它将使用1个线程,但该线程在这10小时内被阻塞,并且它必然需要一些内存来存储对那些1_000_000TimerTask实例的引用)。

这个事实在文档中也提到了:

这个类不提供实时保证:它使用Object.wait(long)方法调度任务。

额外注意:将TimerTask添加到Timer必然会唤醒计时器线程,因为刚刚添加的任务可能是下一个要执行的任务,因此Object.wait(long)方法的超时值需要重新计算。

调度1_000_000 TimerTasks因此必须唤醒该线程多达1_000_000次(它可以更少,因为创建和添加TimerTask实例的任务可能在计时器线程唤醒和检查队列之前将多个TimerTask添加到队列中)。

相关内容

  • 没有找到相关文章

最新更新