Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to reuse a Runnable

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.

like image 357
Gandalf Avatar asked Nov 29 '22 05:11

Gandalf


2 Answers

Your question asks how to reuse a Runnable, so I am going to ignore the other details adn simply answer that question.

If you are using a ThreadPoolExecutor, you can use the [ThreadPoolExecutor#afterExecute][1] method to return the Runnable object to a pool/queue of 'cached' Runnables.

[1]: http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#afterExecute(java.lang.Runnable, java.lang.Throwable)

like image 191
Tim Bender Avatar answered Dec 04 '22 03:12

Tim Bender


A Runnable object is reusable. It is thread object which is not.

Best way ? it is your way :-)

I think it is more a lucene question than a runnable question.

like image 23
Istao Avatar answered Dec 04 '22 03:12

Istao