I have a class that implements Runnable and am currently using an Executor as my thread pool to run tasks (indexing documents into Lucene).
executor.execute(new LuceneDocIndexer(doc, writer));
My issue is that my Runnable class creates many Lucene Field objects and I would rather reuse them then create new ones every call. What’s the best way to reuse these objects (Field objects are not thread safe so I cannot simple make them static) – should I create my own ThreadFactory? I notice that after a while the program starts to degrade drastically and the only thing I can think of is it’s GC overhead. I am currently trying to profile the project to be sure this is even an issue – but for now lets just assume it is.
For now I have decided to just use a simple Producer->Consumer model. I pass a
BlockingQueueto each indexer, rather then a document to index, and then have the main driver of the program add new documents to that queue. The Indexers then feed off that [bounded] queue and reuse theFieldobjects and share the thread-safeIndexWriter.I did find a place where I was possibly not calling
HttpMethod.releaseConnection()so that could have caused my memory issues (uncertain).