gpt4 book ai didi

java - Executors 工厂方法 newScheduledThreadPool 始终返回相同的线程池

转载 作者:行者123 更新时间:2023-12-01 18:41:29 26 4
gpt4 key购买 nike

根据 Java 规范:public static Sc​​heduledExecutorService newScheduledThreadPool(int corePoolSize)“创建一个线程池,可以安排命令在给定的延迟后运行,或定期执行。”

但是根据我的经验,即使我创建两个单独的 ScheduledExecutorService 两次调用 newScheduledThreadPool(int corePoolSize) 工厂方法并安排两个完全不同的 Callable 任务,两个线程都会运行同步地,即一个等待另一个。考虑到已经创建了两个独立的线程池,它们应该同时运行。

public static ScheduledExecutorService SCANNER_SERVICE = Executors.newScheduledThreadPool(10);
public static ScheduledExecutorService UNSERVICERESTORED_SCANNER_SERVICE = Executors.newScheduledThreadPool(10);

Scanner scanner=new Scanner();
UnServiceRestoredTicketScanner unServiceRestoredTicketScanner=new UnServiceRestoredTicketScanner();

if(SCANNER_SERVICE.isShutdown())
SCANNER_SERVICE=Executors.newScheduledThreadPool(10);
SCANNER_SERVICE.scheduleWithFixedDelay(scanner, 0, 30, TimeUnit.SECONDS);


if(UNSERVICERESTORED_SCANNER_SERVICE.isShutdown())
UNSERVICERESTORED_SCANNER_SERVICE=Executors.newScheduledThreadPool(10);
UNSERVICERESTORED_SCANNER_SERVICE.scheduleWithFixedDelay(unServiceRestoredTicketScanner, 0, 40, TimeUnit.SECONDS);

输出:

Scanner Thread started - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
ServiceRestoredTicketScanner Thread started - com.csp.productionsupport.queuemonitor.events.UnServiceRestoredTicketScanner@15ed659
Thread ended - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
Scanner Thread started - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
ServiceRestoredTicketScanner Thread ended - com.csp.productionsupport.queuemonitor.events.UnServiceRestoredTicketScanner@15ed659
Thread ended - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
Scanner Thread started - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
ServiceRestoredTicketScanner Thread started - com.csp.productionsupport.queuemonitor.events.UnServiceRestoredTicketScanner@15ed659
Thread ended - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
Scanner Thread started - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18
ServiceRestoredTicketScanner Thread ended - com.csp.productionsupport.queuemonitor.events.UnServiceRestoredTicketScanner@15ed659
Thread ended - com.csp.productionsupport.queuemonitor.events.Scanner@1fa6d18

最佳答案

您的代码以及您对事物工作原理的理解存在很多问题。

首先 - 正如评论中已经提到的 - 您在两个池中使用相同的扫描仪实例。这解释了为什么您只能从“一个”线程获得输出。

由于您每 30/40 秒安排一次这些线程,因此它们在前 3-4 次运行中不会并行运行:

30s: Thread A
40s: Thread B
60s: Thread A
80s: Thread B
90s: Thread A
120s: Thread A + B (it will be "random" which one runs first)

对线程这个概念存在误解。如果您有 2 个每个有 10 个线程的池,或者有 1 个有 20 个线程的池,这都没有关系。在您的示例中,如果您只有 1 个池和 1 个线程,那么它甚至不会产生任何影响。使用多个池的唯一原因是以不同的方式管理这些池,并且不要让内部的线程“单独”运行。因此,要回答您的实际问题,Java 如何在内部管理这些池并不重要。

我不知道您的代码的其余部分,但您检查池是否关闭然后创建一个新池的事实告诉我,您的代码整体上存在体系结构问题。仅当所有工作完成并且主线程需要等待所有线程完成处理数据或退出时才需要关闭池。使用线程池来节省线程创建的开销然后一遍又一遍地创建线程池是特别没有意义的。

关于您尝试归档的内容的信息太少,无法提供任何进一步的建议,但我非常确定,无论您尝试做什么,都可以比您提出的方式简单得多。如果您重新发布以获得架构帮助,可能会有所帮助。

关于java - Executors 工厂方法 newScheduledThreadPool 始终返回相同的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19814774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com