代码之家  ›  专栏  ›  技术社区  ›  Gandalf

重用runnable的最佳方法

  •  4
  • Gandalf  · 技术社区  · 14 年前

    我有一个实现 Runnable 目前我使用一个执行器作为我的线程池来运行任务(将文档索引到lucene)。

    executor.execute(new LuceneDocIndexer(doc, writer));
    

    我的问题是我的可运行类创建了许多lucene Field 对象,我宁愿重用它们,然后每次调用都创建新的对象。什么是重用这些对象的最佳方法( 对象不是线程安全的,所以我不能简单地使它们成为静态的)-我是否应该创建自己的 ThreadFactory ?我注意到一段时间后,程序开始急剧降级,我唯一能想到的是GC开销。我目前正试图对项目进行概要分析,以确保这甚至是一个问题-但现在让我们假设它是。

    4 回复  |  直到 14 年前
        1
  •  14
  •   Tim Bender    14 年前

    你的问题是如何重用一个runnable,所以我将忽略其他细节,只需回答这个问题。

    如果使用的是threadpoolexecutor,则可以使用[threadpoolexecutor\afterexecute][1]方法将runnable对象返回到“缓存”runnable的池/队列。

    〔1〕: http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#afterExecute(java.lang.Runnable ,java.

        2
  •  5
  •   Istao    14 年前

    可运行对象是可重用的。不是线程对象。

    最好的方法?这是你的方式:-)

    我认为这更像是一个lucene的问题,而不是一个无法回答的问题。

        3
  •  1
  •   bajafresh4life    14 年前

    你可能想做更多的基准测试来确定是什么导致了你的减速。

    我敢打赌,您的问题与创建字段实例无关。字段没有任何终结器,并且它们不是为池而设计的。

        4
  •  1
  •   Gandalf    14 年前

    现在我决定只使用一个简单的生产者-消费者模型。我通过了 BlockingQueue 到每个索引器,而不是一个要索引的文档,然后让程序的主驱动程序向该队列添加新文档。然后,索引器从[有界]队列馈送并重用 Field 对象并共享线程安全 IndexWriter .

    我确实找到了一个我可能不打电话的地方 HttpMethod.releaseConnection() 所以这可能会导致我的记忆问题(不确定)。