根据Java规范:
public static ScheduledExecutorService 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)


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

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

关于您要归档的内容的信息太少,无法给出任何进一步的建议,但是我很确定,无论您想做什么,都可以比您介绍的方法简单得多。如果您重新发布以寻求体系结构帮助,则可能会有所帮助。

09-26 17:49