Совместное использование данных между экземплярами Runnable в одном потоке с использованием ThreadPoolExecutor

У меня есть не потокобезопасный объект, который я использую при выполнении Runnable. Однако создание этого объекта требует больших затрат, а их создание в каждом Runnable вызывает слишком много накладных расходов. Вместо этого я хочу, чтобы ThreadPoolExecutor использовал мой пользовательский поток, который имеет дополнительное поле, и делился этим полем между экземплярами Runnable, работающими в одном потоке.

Я создал собственный класс Thread с моим настраиваемым полем. Я создаю ThreadPoolExecutor следующим образом:

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

CustomThreadFactory создает мой пользовательский метод Thread in 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