【问题标题】:Why is java.util.concurrent.FutureTask not serializable为什么 java.util.concurrent.FutureTask 不可序列化
【发布时间】: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&lt;Callable&gt; priceCalls 包含对适当价格调用的方法调用

我收到对象类型不可序列化!针对 java.util.concurrent.FutureTask 列表字段

我假设我应该以不同的方式设计它。任何人都可以提供有关如何完成此操作的任何想法吗?

如果有帮助,我正在使用 Spring

【问题讨论】:

  • 序列化FutureTask 是没有意义的,因为您需要序列化它的完整上下文,其中可能包含任意资源;最重要的是一个Thread 实例——你将如何序列化一个线程?答:不能;至少不是在java中。另外,我相信这是一个 XY 问题 - 您究竟想通过序列化 FutureTask 实例来实现什么?
  • @l4mpi 所说的:序列化这样的对象完全没有意义。在任何情况下,FutureTask 都不是类的不变量。如果您想要序列化的类中有这样的字段,请将其设为transient。请注意,在“没有意义”部门,Reentrant*Lock 类 是 Serializable...
  • 我现在已经为我的问题添加了更多细节,因为很明显我认为我无法解决这个问题

标签: java spring wicket java.util.concurrent


【解决方案1】:

FutureTask 不可序列化,因为它依赖于其他资源,例如 Executor、可能是 Thread 实例、Queue 和无法轻松序列化的操作系统资源。

【讨论】:

  • 它可以序列化吗?如果是这样,是否有任何示例可以实现这一点?
  • 没有办法序列化任何直接实现Future 的东西。一种解决方法是创建一个对象,其中包含稍后再次提交任务所需的所有数据并将其序列化。
【解决方案2】:

另一种选择是创建您自己的 Future 实现,它也实现了 Serializable。

在下面的页面中,作者展示了这一点。在这种情况下,他在 Future 实现背后使用了 JMS。

http://www.javacodegeeks.com/2013/02/implementing-custom-future.html

【讨论】:

    【解决方案3】:

    我最终使用了 Spring 的 Async 和 AjaxLazyLoadPanel

    在此处查看更多信息: http://apache-wicket.1842946.n4.nabble.com/AjaxLazyLoadPanel-loading-asynchronously-td4664035.html#a4665188

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-31
      • 2014-09-12
      • 2013-07-09
      • 2013-05-26
      • 2015-04-22
      • 1970-01-01
      • 2010-12-27
      • 2010-11-01
      相关资源
      最近更新 更多