当前位置: 首页 > 知识库问答 >
问题:

Java线程池执行器服务关闭未按预期工作

姬向明
2023-03-14

目前,我正在使用一个围绕脚本共享的执行器服务的全局实例。我的想法是调用并将任务添加到池中,以便线程进行工作,当所有线程都完成时,然后写入输出文件以获取结果。

下面是一个小视图:主线程调用t0、t1、t2、t3,t0调用t4、t5。其他线程也可以调用其他线程。

main thread calls:
     openFile()
     -> t0
          -> t4
          -> t5
          ...
     -> t1
     -> t2
     -> t3 
     ...
     shutdown()
     awaitTermination(60, MINUTES)
     writeFile()
     closeFile()

问题是shutdown()和awaitTermination()在t0、t1、t2、t3时被调用并完成,而没有等待t4和t5。因此,当t4和t5仍在完成任务时,输出被写入。我使用与其他实例相同的实例执行t4和t5,认为它会将其添加到池中,awaitTermination()会等待它们(以及由其他线程调用的其他线程)完成。

我该怎么做呢?

共有1个答案

葛志国
2023-03-14

在知道 t0 完成之前不要调用 shutdown - 然后您将知道 t4/t5 必须在同一执行程序服务上排队:

Future<?> t0fut = execService.submit(t0);
// deal with others t1..t3
...
t0fut.get();
execService.shutdown();
...

t0fut.get()的调用应该阻塞,直到t0完成,然后对execService.shutdown()的调用不会导致错误,因为t4/t5必须在t0结束之前已经提交。

 类似资料:
  • 在我的项目中,我正在构建一个Java的执行框架,它接收来自客户端的工作请求。工作(大小不同)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与一个ThreadPool相关联。ThreadPools的配置方式使引擎的整体性能达到最佳。 这种设计有助于我们有效地平衡请求的负载,大型请求不会占用系统资源。然而,当一些队列为空并且它们各自的线程池闲置时,该解决方案有时会变得

  • 我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因

  • Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。

  • 根据ThreadPoolExecutor文档(Java ThreadPoolExecutor),如果我像这样创建一个executor服务: 当#线程

  • 我使用线程池执行器,将其替换为旧版线程。 我创建了如下执行器: 这里的核心大小是maxpoolsize/5。我已经在应用程序启动时预先启动了所有核心线程,大约160个线程。 在传统设计中,我们创建并启动了大约670个线程。 但关键是,即使在使用Executor并创建和替换遗留设计之后,我们也不会得到更好的结果。 对于结果内存管理,我们使用Top命令来查看内存使用情况。对于时间,我们将System.

  • 工具:Win7、Launch4J3.5、简单的Hello world Java控制台应用程序(绑定在JAR文件中) 大家好, 我有一个基本的JAVA控制台应用程序,它不请求任何输入,只是一个打开控制台窗口并显示Hello World文本的简单应用程序。 包装程序清单:C:\launch4j\manifest\uac.exe.manifest(也尝试保留此空白) 其余的都是默认的。