CICSCallable 线程没有结束
CICSCallable thread does not end
我有一个 Java 应用程序,它将 运行 在 IBM Liberty 应用程序服务器上;我正在尝试对 CICSExecutorService
使用多线程。这是我的用例:
- 创建
CICSExecutorService
的实例;
- 从实现
CICSTransactionCallable
; 的 class 创建一个线程(对 Db2 进行简单的 select 查询)
- 将线程提交给执行者服务;
- 关闭executor服务,等待终止;
这是代码:
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 执行程序服务进行了一些简单的本地测试,行为是,在调用 shutdown 和 awaitTermination 方法之后,程序等待线程终止(除非线程的执行需要超过 100 秒,指定的超时时间),然后继续执行。问题是,当我使用上面的代码时,我看到了不同的行为:事实上,如果线程(唯一与 CICSExecutorService
连接的线程,程序仍然停留在 awaitTermination
行 100 秒) 在(到达 call()
方法的末尾)之前结束。我也尝试使用静态方法 CICSExecutorService.runAsCICS()
而不是 cicsExecutorService.submit()
,但我得到了相同的结果。似乎子线程在到达 call()
方法的末尾时也仍然存在,因此 awaitTermination
一直等到超时结束。有什么建议吗?
CICS 已经在内部提供了一个 CICSExecutorService 实例。它可以直接从静态 API 方法访问,例如 运行AsCICS() 方法。您不会(也不应该)尝试构建 ExecutorService,或自己控制 ExecutorService - 这一切都是在内部完成的,以确保正确的环境和 life-cycles 得到遵守。 class 上有一个 public 构造函数,纯粹是为了符合声明式服务的要求,而不是用于一般用途。看起来 Javadoc 应该更明确地说明预期用途 - 我会看看是否可以更新它。
此页面提供了有关如何使用 API 的更多详细信息(尽管是针对 Runnable 而不是 Callable,但 API 遵循相同的模式):
https://www.ibm.com/support/knowledgecenter/SSGMCP_5.5.0/applications/developing/java/dfhpjgo.html
请注意,您正在向执行器提交 'Callable',而不是线程。 CICSExecutorService 将在后台决定 运行 您在 'CICS' 启用线程上的可调用 - 允许线程池和 re-use 以及内部的其他此类智能。
此外,如果您正在驱动 CICS Liberty 应用程序,您通常不需要自己生成新的启用 CICS 的线程 - 应用程序将隐式处理多个并发请求(通常 web-requests)。
从代码片段中我无法确定您的应用程序试图实现什么,但是您提交的 Callable 对象应该有它的 call() 方法驱动完成,此时 CICS 任务将结束,并且线程它将 运行 返回给 ExecutorService 的 thread-pool。该线程将在该池中保持休眠状态,但 no-longer 与 CICS t运行saction 相关联(为另一个 t运行saction 准备好 re-use)。因此,如果您明确尝试确定线程是否已终止,那么您会感到失望,因为它们并非旨在在 JVM 服务器被禁用之前在 Liberty 环境中终止。
通常在使用 运行AsCICS() 方法时,您提交 Callable 并取回 Future 对象。然后,该 Future 对象用于确定提交的工作何时完成。您不应尝试直接等待或操作 ExecutorService。
希望对您有所帮助,但如果您仍然遇到问题,请 post 更多 test-application 并描述您要实现的目标,以便我们提供更好的指导。谢谢
如果您想启动一堆子线程作为 CICS 任务并等待所有子线程终止,您也可以使用 CICS Async API. This also has a JCICS interface, and a set of samples are available on the CICSDev GitHub
我有一个 Java 应用程序,它将 运行 在 IBM Liberty 应用程序服务器上;我正在尝试对 CICSExecutorService
使用多线程。这是我的用例:
- 创建
CICSExecutorService
的实例; - 从实现
CICSTransactionCallable
; 的 class 创建一个线程(对 Db2 进行简单的 select 查询)
- 将线程提交给执行者服务;
- 关闭executor服务,等待终止;
这是代码:
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 执行程序服务进行了一些简单的本地测试,行为是,在调用 shutdown 和 awaitTermination 方法之后,程序等待线程终止(除非线程的执行需要超过 100 秒,指定的超时时间),然后继续执行。问题是,当我使用上面的代码时,我看到了不同的行为:事实上,如果线程(唯一与 CICSExecutorService
连接的线程,程序仍然停留在 awaitTermination
行 100 秒) 在(到达 call()
方法的末尾)之前结束。我也尝试使用静态方法 CICSExecutorService.runAsCICS()
而不是 cicsExecutorService.submit()
,但我得到了相同的结果。似乎子线程在到达 call()
方法的末尾时也仍然存在,因此 awaitTermination
一直等到超时结束。有什么建议吗?
CICS 已经在内部提供了一个 CICSExecutorService 实例。它可以直接从静态 API 方法访问,例如 运行AsCICS() 方法。您不会(也不应该)尝试构建 ExecutorService,或自己控制 ExecutorService - 这一切都是在内部完成的,以确保正确的环境和 life-cycles 得到遵守。 class 上有一个 public 构造函数,纯粹是为了符合声明式服务的要求,而不是用于一般用途。看起来 Javadoc 应该更明确地说明预期用途 - 我会看看是否可以更新它。
此页面提供了有关如何使用 API 的更多详细信息(尽管是针对 Runnable 而不是 Callable,但 API 遵循相同的模式): https://www.ibm.com/support/knowledgecenter/SSGMCP_5.5.0/applications/developing/java/dfhpjgo.html
请注意,您正在向执行器提交 'Callable',而不是线程。 CICSExecutorService 将在后台决定 运行 您在 'CICS' 启用线程上的可调用 - 允许线程池和 re-use 以及内部的其他此类智能。
此外,如果您正在驱动 CICS Liberty 应用程序,您通常不需要自己生成新的启用 CICS 的线程 - 应用程序将隐式处理多个并发请求(通常 web-requests)。
从代码片段中我无法确定您的应用程序试图实现什么,但是您提交的 Callable 对象应该有它的 call() 方法驱动完成,此时 CICS 任务将结束,并且线程它将 运行 返回给 ExecutorService 的 thread-pool。该线程将在该池中保持休眠状态,但 no-longer 与 CICS t运行saction 相关联(为另一个 t运行saction 准备好 re-use)。因此,如果您明确尝试确定线程是否已终止,那么您会感到失望,因为它们并非旨在在 JVM 服务器被禁用之前在 Liberty 环境中终止。
通常在使用 运行AsCICS() 方法时,您提交 Callable 并取回 Future 对象。然后,该 Future 对象用于确定提交的工作何时完成。您不应尝试直接等待或操作 ExecutorService。
希望对您有所帮助,但如果您仍然遇到问题,请 post 更多 test-application 并描述您要实现的目标,以便我们提供更好的指导。谢谢
如果您想启动一堆子线程作为 CICS 任务并等待所有子线程终止,您也可以使用 CICS Async API. This also has a JCICS interface, and a set of samples are available on the CICSDev GitHub