我有一个实现 Runnable
的类,目前正在使用 Executor 作为我的线程池来运行任务(将文档索引到 Lucene 中)。
executor.execute(new LuceneDocIndexer(doc, writer));
我的问题是我的 Runnable 类创建了许多 Lucene Field
对象,我宁愿重用它们,然后每次调用都创建新的对象。重用这些对象的最佳方法是什么(Field
对象不是线程安全的,所以我不能简单地将它们设为静态)——我应该创建自己的 ThreadFactory
吗?我注意到一段时间后程序开始急剧下降,我唯一能想到的就是 GC 开销。我目前正在尝试分析该项目以确保这甚至是一个问题 - 但现在让我们假设它是。
最佳答案
你的问题问的是如何重用 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.lang.Throwable)
关于java - 重用 Runnable 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2774252/