1

我正在修改一些遗留代码以使用 Spring 的ThreadPoolTaskExecutor. 此应用程序有一个父代理进程,它异步触发线程,然后使用 getState() 调用监视它们的状态。现在使用ThreadPoolTaskExecutor'sexecute()方法来触发子线程getState(),即使在子线程的 run() 方法完成之后,它也总是返回“NEW”。

一种替代方法是在提供状态信息的子线程对象中手动维护一个属性,但我想知道在使用ThreadPoolTaskExecutor.

4

2 回答 2

2

而是使用 Runnable 使用 Callable,而不是使用执行使用提交。

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()

于 2012-05-30T12:08:53.003 回答
1

您可能正在传递一个扩展Threadexecute()何时应该传递一个实现的类的类Runnable。如果是这种情况,那么您的Thread课程将永远不会开始,并且将始终显示为NEW有意义的状态。

execute()方法需要一个Runnable类。您的代码工作的唯一原因是它Thread也实现了可运行。该类ThreadPoolTaskExecutor在内部管理自己的线程。然后,您的Thread类永远不会作为线程启动,只会run()调用它的方法。

于 2012-05-29T17:19:17.727 回答