Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java定时执行器服务功能_Java_Scheduled Tasks_Scheduledexecutorservice - Fatal编程技术网

Java定时执行器服务功能

Java定时执行器服务功能,java,scheduled-tasks,scheduledexecutorservice,Java,Scheduled Tasks,Scheduledexecutorservice,我正在设计一个服务器,在其中我需要能够安排数千个任务。该任务每5秒执行一次。scheduledexecutorservice能否以良好的准确性处理数千项任务?我试着用一个线程来计时。但实际任务将在线程池中执行。谢谢 我不确定它到底是如何工作的,所以如果有人能澄清这一点,我将不胜感激 我建议您阅读scheduler executor服务的javadocs。有没有什么特别的地方让你怀疑它的工业实力。您应该使用它并测量您的性能,以检查它是否与您的用例匹配 此外,除非您有充分的理由,否则不应修改库类的实

我正在设计一个服务器,在其中我需要能够安排数千个任务。该任务每5秒执行一次。scheduledexecutorservice能否以良好的准确性处理数千项任务?我试着用一个线程来计时。但实际任务将在线程池中执行。谢谢


我不确定它到底是如何工作的,所以如果有人能澄清这一点,我将不胜感激

我建议您阅读scheduler executor服务的javadocs。有没有什么特别的地方让你怀疑它的工业实力。您应该使用它并测量您的性能,以检查它是否与您的用例匹配

此外,除非您有充分的理由,否则不应修改库类的实现(在客户端分离调度线程和任务执行线程)

但是,如果您的调度标准预期会变得复杂,超出scheduler executor服务提供的基本用例,则应使用quartz之类的库进行评估。

由线程池支持。粗略地说,您可以使用以下等式计算并发运行任务而不延迟所需的线程数:

池中的最小线程数等于平均每秒执行的任务数乘以平均任务运行时间

例如,平均而言,您启动2个任务需要3秒(平均)时间才能完成,您需要6个线程。当然,这假设任务随着时间的推移分布相当均匀

您还可以使用,理论上可以同时运行无限多个任务。显然,可用内存和上下文开关的数量将大大减少这个数量


如果您的使用场景是:每五秒钟在完全相同的时间点运行数千个任务计划-JVM或任何其他平台都不会处理这个问题。即使有数千个线程,也会受到CPU内核数量的限制。准确性在很大程度上取决于任务的性质(CPU密集型?阻塞I/O?)

在编写回答时,您应该尝试回答这个问题,但无论如何还是要感谢任务是否在其计时周期内创建线程?比如,如果我给一个任务计时,让它在5秒钟内运行,它会立即打开一个新线程/使用一个nee线程,还是直到5秒钟后才会这样做?@Tukhes:这取决于你使用的线程池。有些池会创建固定数量的线程,如果所有线程都已使用,则任务将等待。其他缓存已经创建了线程,所以如果必须执行新任务,它要么使用缓存的线程,要么使用池创建新线程(如果使用了所有线程)。一些线程池也会在一段时间后关闭空闲线程。线程何时创建?现在还是5秒钟后@托马斯兹Nurkiewicz@Tukhes:完全取决于您选择的线程池。您可以提前或延迟创建所有内容。如果延迟,线程将仅在需要时创建,即5秒后。但它将在空闲状态下生存,并在5秒钟后重新使用。现在我的意思是,当我启动我的应用程序@tomasz nurkiewicz时,不必安排任务