Споделяне на данни между екземпляри на Runnable в една и съща нишка с помощта на ThreadPoolExecutor

Имам обект, който не е безопасен за нишки, който използвам, когато изпълнявам Runnable. Този обект обаче е скъп за създаване и създаването им във всеки Runnable причинява твърде много разходи. Вместо това искам ThreadPoolExecutor да използва моята персонализирана нишка, която има допълнително поле, и да споделя това поле между екземпляри Runnable, работещи в една и съща нишка.

Създадох персонализиран клас Thread, който има моето персонализирано поле. Създавам ThreadPoolExecutor така:

executor = new ThreadPoolExecutor(5, 50, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new CustomThreadFactory())

CustomThreadFactory създава моята персонализирана нишка в newThread(Runnable r) метод. Въпреки това, за да използвам полето в екземпляри на Runnable, трябваше също да създам моя персонализиран Runnable, който взема препратката към моя обект без нишка и да го запиша, за да го използвам в метода run().

Въпреки това, тъй като ThreadPoolExecutor използва Workers, за да изпълни Runnable екземпляри, не можах да мога да извикам моя обект, който не е безопасен за нишки, към Runnable екземпляри. Има ли някакъв удобен начин да направя такова нещо с помощта на ThreadPoolExecutor или трябва да създам персонализиран ThreadPoolExecutor?


person Boyolame    schedule 19.10.2014    source източник
comment
Трябва да използвате ThreadLocal, вместо да използвате персонализирани нишки. docs.oracle.com/javase/7/docs/ api/java/lang/ThreadLocal.html   -  person JB Nizet    schedule 19.10.2014


Отговори (1)


Само за да може този въпрос да бъде маркиран като отговорен:

Ако няма друга причина да използвате персонализирана фабрика за нишки (като даване на персонализирани имена на нишки), тогава ThreadLocal е предпочитаният начин. Точно отговаря на вашето описание на това, което искате да постигнете.

person Ralf H    schedule 28.10.2014