Я пытаюсь использовать как InheritableThreadLocal
, так и ThreadPoolExecutor
.
Это прерывается, потому что ThreadPoolExecutor
повторно использует потоки для каждого пула (в конце концов, это пул), что означает, что InheritableThreadLocal
работает не так, как ожидалось. Теперь проблема кажется мне очевидной, но она была особенно ловушкой для отслеживания.
Я использую InheritableThreadLocal
, чтобы каждый из нескольких процессов верхнего уровня имел собственное соединение с базой данных для себя и любых подпроцессов, которые он порождает. Я не просто использую один общий пул соединений, потому что каждый процесс верхнего уровня будет выполнять много многошаговую работу с его соединением перед тем, как совершить работу с базой данных и/или подготовить много PreparedStatements, которые используются снова и снова.
Я использую общий ThreadPoolExecutor
между этими процессами верхнего уровня, потому что есть определенные поведения, которые необходимо закрыть. например Несмотря на то, что у меня может быть 4 процесса верхнего уровня, у меня может быть только один процесс записи в базу данных за раз (или система должна затвора на каком-то другом общем ресурсе). Таким образом, процесс верхнего уровня создаст Runnable
и отправлю его в общий ThreadPoolExecutor
, чтобы убедиться, что одновременно выполняется не более одного (или два или три в зависимости от случая) всей системы.
Проблема состоит в том, что, поскольку ThreadPoolExecutor
повторно использует свои потоки для пулов, InheritableThreadLocal
собирает исходное значение, которое было запущено в этом пуле, а не значение, которое было в процессе верхнего уровня, который отправил Выполняется до ThreadPoolExecutor
.
-
Есть ли способ заставить рабочий пул в
ThreadPoolExecutor
использовать значениеInheritableThreadLocal
, которое было в контексте процесса, который создал Runnable, а не в контексте повторно используемого пула потоков? -
Альтернативно, существует ли какая-либо реализация
ThreadPoolExecutor
, которая создает новый поток каждый раз при запуске нового Runnable? Для моих целей мне только заботится о том, чтобы количество одновременных потоков на фиксированный размер. -
Есть ли у кого-нибудь другое решение или предложение, чтобы я выполнил то, что я описал выше?
(Хотя я понимаю, что могу решить эту проблему, передав соединение с базой данных из класса в класс в subthread на subthread, например, на какой-то общинный велосипед, я хотел бы избежать этого.)
Есть предыдущий вопрос о StackOverflow, InheritableThreadLocal и пулах потоков, который также затрагивает эту проблему. Однако решение этой проблемы заключается в том, что это плохой вариант использования InheritableThreadLocal, который, как мне кажется, не относится к моей ситуации.
Спасибо за любые идеи.