可以安排多少任务稍后调用&这有限制吗?我没有看到任何指定的最大限制。例如:是否可以将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_000TimerTask
的Timer
将不需要任何CPU资源,直到10小时过去(它将使用1个线程,但该线程在这10小时内被阻塞,并且它必然需要一些内存来存储对那些1_000_000TimerTask
实例的引用)。
这个事实在文档中也提到了:
这个类不提供实时保证:它使用
Object.wait(long)
方法调度任务。
额外注意:将TimerTask
添加到Timer
必然会唤醒计时器线程,因为刚刚添加的任务可能是下一个要执行的任务,因此Object.wait(long)
方法的超时值需要重新计算。
调度1_000_000 TimerTasks因此必须唤醒该线程多达1_000_000次(它可以更少,因为创建和添加TimerTask
实例的任务可能在计时器线程唤醒和检查队列之前将多个TimerTask
添加到队列中)。