【发布时间】:2014-03-13 10:31:37
【问题描述】:
我目前正在使用 Apache Wicket。我有一些 REST 调用,每个调用需要几秒钟。 Wicket 只允许同步调用 ajax,所以我尝试使用 Future 和 Callable。
这是我课程的一部分:
public abstract class GetPrices extends AbstractAjaxTimerBehavior {
private static final long serialVersionUID = 1L;
private List<Future<List<Result>>> list;
public GetPrices(Duration updateInterval, List<Callable> priceCalls) {
super(updateInterval);
list = new ArrayList<Future<List<Result>>>();
ExecutorService executor = Executors.newFixedThreadPool(priceCalls.size());
for(Callable callable : priceCalls) {
list.add(executor.submit(callable));
}
executor.shutdown();
}
@Override
protected void onTimer(AjaxRequestTarget target) {
while(list.hasNext()) {
Future<List<Result>> future = listIterator.next();
if(future.isDone()) {
List<Result> data = future.get();
//Process data
}
}
}
//Error handling etc
}
List<Callable> priceCalls 包含对适当价格调用的方法调用
我收到对象类型不可序列化!针对 java.util.concurrent.FutureTask 列表字段
我假设我应该以不同的方式设计它。任何人都可以提供有关如何完成此操作的任何想法吗?
如果有帮助,我正在使用 Spring
【问题讨论】:
-
序列化
FutureTask是没有意义的,因为您需要序列化它的完整上下文,其中可能包含任意资源;最重要的是一个Thread实例——你将如何序列化一个线程?答:不能;至少不是在java中。另外,我相信这是一个 XY 问题 - 您究竟想通过序列化FutureTask实例来实现什么? -
@l4mpi 所说的:序列化这样的对象完全没有意义。在任何情况下,
FutureTask都不是类的不变量。如果您想要序列化的类中有这样的字段,请将其设为transient。请注意,在“没有意义”部门,Reentrant*Lock类 是Serializable... -
我现在已经为我的问题添加了更多细节,因为很明显我认为我无法解决这个问题
标签: java spring wicket java.util.concurrent