目前,我正在使用一个围绕脚本共享的执行器服务的全局实例。我的想法是调用并将任务添加到池中,以便线程进行工作,当所有线程都完成时,然后写入输出文件以获取结果。
下面是一个小视图:主线程调用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()会等待它们(以及由其他线程调用的其他线程)完成。
我该怎么做呢?
在知道 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(也尝试保留此空白) 其余的都是默认的。