如何使用ThreadPoolTask​​Executor获取线程状态?

时间:2012-05-29 16:53:09

标签: java multithreading spring

我正在修改一些遗留代码以使用Spring的ThreadPoolTaskExecutor。此应用程序具有父代理进程,该进程异步触发线程,然后使用getState()调用监视其状态。既然ThreadPoolTaskExecutor的{​​{1}}方法被用来触发子线程,execute()总是返回“NEW”,即使在子线程的run()方法完成之后也是如此。

一种替代方法是手动维护提供状态信息的子线程对象中的属性,但我想知道在使用getState()时是否存在获取线程状态的已知方法。

2 个答案:

答案 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()方法。