java - 重用 Runnable 的最佳方式

标签 java multithreading concurrency lucene

我有一个实现 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/

相关文章:

java - HTTPs 可以实现 Restful Web 服务吗?

java - 继承的方法可以调用重写方法而不是原始方法吗?

java - Android - 无法转换 org.ksoap2.soapfault

c - 线程的段错误(核心转储)

java - 使用 JFreeChart 更改系列时出现随机错误

java - 我想使用 Java 获取我的 Android 设备的内部版本号、Android 版本。我使用以下代码:

multithreading - Delphi TMonitor.Wait多线程问题

python - Python 中的外部异常可以在代码块的持续时间内延迟吗?

c++ - std::vector 与一位读者和一位作者的多线程同步:仅在调整大小时锁定

Java BlockingQueue take() 与 poll()