我正在修改一些遗留代码以使用Spring的ThreadPoolTaskExecutor
。此应用程序具有父代理进程,该进程异步触发线程,然后使用getState()调用监视其状态。既然ThreadPoolTaskExecutor
的{{1}}方法被用来触发子线程,execute()
总是返回“NEW”,即使在子线程的run()方法完成之后也是如此。
一种替代方法是手动维护提供状态信息的子线程对象中的属性,但我想知道在使用getState()
时是否存在获取线程状态的已知方法。
答案 0 :(得分:2)
而是使用Runnable使用Callable,而不是使用execute use submit。
Sample usage for Callable
private class TaskCallable implements Callable<SomeResponse> {
private final SomeRequest request;
public TaskCallable (final SomeRequest request) {
this.request = request;
}
public SomeResponse call() throws Exception {
SomeResponse response = someService.getData(request);
return response;
}
}
TaskCallable callable = new TaskCallable(request);
Future<SomeResponse> future = pooledExecutor.submit(callable);
你可以查看future.isDone()
答案 1 :(得分:1)
当您应该传递实现Thread
的类时,您可能会将execute()
扩展为Runnable
的类。如果是这种情况,那么您的Thread
课程将永远不会启动,并始终显示为有意义的州NEW
。
execute()
method需要Runnable
课程。代码工作的唯一原因是Thread
也实现了runnable。 ThreadPoolTaskExecutor
类在内部管理自己的线程。那么你的Thread
类永远不会作为一个线程启动,只会调用它的run()
方法。