我有一个Java应用程序,它将在IBM Liberty应用程序服务器上运行;我正在尝试对CICSExecutorService
使用多线程。这是我的用例:
CICSExecutorService
的实例; CICSTransactionCallable
的类创建线程(对Db2进行简单的选择查询); 这是代码:
CICSExecutorService cicsExecutorService = new CICSExecutorService();
//CICSReadingJob is the class that implements CICSTransactionCallable interface
CICSReadingJob<String> thread1 = new CICSReadingJob<>();
Future<List<String>> future1 = cicsExecutorService.submit(thread1);
cicsExecutorService.shutdown();
cicsExecutorService.awaitTermination(100, TimeUnit.SECONDS);
我已经使用标准的Java executor服务进行了一些简单的本地测试,其行为是,在调用shutdown和awaitTermination方法之后,程序将等待线程终止(除非线程的执行要花费100秒以上,指定的超时),然后执行继续。问题是,当我使用上面的代码时,我看到了不同的行为:实际上,即使线程(唯一与awaitTermination
连接的线程,该程序也仍然停留在CICSExecutorService
行上100秒。 )之前(到达call()
方法的结尾)之前结束。我也尝试使用静态方法CICSExecutorService.runAsCICS()
而不是cicsExecutorService.submit()
,但得到的结果相同。子线程似乎在到达call()
方法的末尾时仍然保持活动状态,因此,awaitTermination
一直等待到超时结束。有什么建议吗?
答案 0 :(得分:3)
CICS已在内部提供CICSExecutorService实例。可直接从静态API方法(如runAsCICS()方法)访问它。您不会(也不应)尝试构造ExecutorService或自己控制ExecutorService -这都是在内部完成的,以确保观察到正确的环境和生命周期。该类上有一个公共构造函数,纯粹是为了满足声明式服务的要求,而不是一般用途。看来Javadoc应该更明确地说明其预期用途-我看看是否可以进行更新。
此页面提供了有关如何使用API的更多详细信息(尽管适用于Runnable而非Callable,但API遵循相同的模式): https://www.ibm.com/support/knowledgecenter/SSGMCP_5.5.0/applications/developing/java/dfhpjgo.html
请注意,您正在向执行程序提交“可调用”而不是线程。 CICSExecutorService将在后台决定在启用“ CICS”的线程上运行可调用对象-允许在内部进行线程池和重用以及其他此类智能功能。
此外,如果您正在驱动CICS Liberty应用程序,则通常不需要自己生成新的启用CICS的线程-该应用程序将隐式处理多个并发请求(通常是Web请求)。
从代码片段中,我无法确定您的应用程序试图实现什么,但是您提交的Callable对象应该将其call()方法驱动完成,届时CICS任务将结束,并且该线程位于它运行后将返回到ExecutorService的线程池。该线程将在该池中保持休眠状态,但不再与CICS事务关联(准备由另一个事务重用)。因此,如果您明确地尝试确定线程是否已终止,那么您将感到失望,因为在禁用JVM服务器之前,它们不打算在Liberty环境中终止。
通常,在使用runAsCICS()方法时,您将提交Callable并获取Future对象。然后,使用该Future对象来确定提交的工作何时完成。您不应尝试直接等待或操纵ExecutorService。
希望对您有所帮助,但是如果您仍然遇到问题,请发布更多测试应用程序并描述您要达到的目标,以便我们提供更好的指导。谢谢。
答案 1 :(得分:0)
如果您要启动一堆子线程作为CICS任务并等待直到所有子线程终止,则也可以使用CICS Async API来完成。它还具有一个JCICS界面,并且在CICSDev GitHub
上有一组示例。