我正在设计一个服务器,在其中我需要能够安排数千个任务。该任务每5秒执行一次。 Scheduledexecutor服务是否能够正确处理数千个任务?我正在尝试仅在一个线程中进行计时。但是实际的任务将在线程池中执行。谢谢
我不确定它是如何工作的,因此如果有人可以澄清这一点,将不胜感激!
最佳答案
ScheduledExecutorService
由线程池支持。粗略地说,您可以使用以下等式计算并发运行任务所需的线程数,而不会造成延迟:
池中的最小线程数等于每秒平均执行的任务数乘以平均任务运行时间
例如,平均而言,您开始2个任务需要3秒钟(平均)才能完成,因此您需要6个线程。当然,这假设任务随着时间的推移分布相当均匀。
您还可以使用Executors.newCachedThreadPool()
,理论上它可以同时运行无限数量的任务。显然可用的内存和上下文切换的数量将大大减少该数量。
如果您的使用场景是:每五秒钟在完全相同的时间点运行数千个任务计划-JVM和任何其他平台都不会处理该任务。即使您具有数千个线程,也受到CPU内核数量的限制。准确性在很大程度上取决于任务的性质(CPU密集型?阻塞I / O?)