将 InheritableThreadLocal 与 ThreadPoolExecutor 一起使用 -- 或者 -- 不重用线程的 ThreadPoolExecutor
我正在尝试同时使用和.InheritableThreadLocal
ThreadPoolExecutor
这之所以崩溃,是因为重用每个池的线程(毕竟它是一个池),这意味着 不能按预期工作。现在,这个问题对我来说似乎很明显,但追踪起来尤其棘手。ThreadPoolExecutor
InheritableThreadLocal
我使用,以便几个顶级进程中的每一个都有自己的数据库连接,以及它生成的任何子进程。我不只使用一个共享连接池,因为每个顶级进程在提交到数据库和/或准备大量反复使用的ReadyStatements之前,都会对其连接进行大量多步骤工作。InheritableThreadLocal
我使用这些顶级进程之间的共享,因为某些行为需要进行门控。例如,即使我可能正在运行4个顶级进程,我一次只能让任何一个进程写入数据库(或者系统需要访问其他共享资源)。因此,我将让顶级流程创建一个并将其发送到共享,以确保在整个系统中同时运行的不超过一个(或两个或三个)。。ThreadPoolExecutor
Runnable
ThreadPoolExecutor
问题在于,由于 the 重用其线程用于池,因此 正在选取在该池中运行的原始值,而不是在将 Runnable 发送到 的顶级进程中的值。ThreadPoolExecutor
InheritableThreadLocal
ThreadPoolExecutor
有没有办法强制 中的工作线程池使用创建 Runnable 的进程上下文中的值,而不是在重用的线程池的上下文中的值?
ThreadPoolExecutor
InheritableThreadLocal
或者,是否有任何实现,每次启动新的Runnable时都会创建一个新线程?出于我的目的,我只关心将同时运行的线程数控制到固定大小。
ThreadPoolExecutor
人们有没有其他解决方案或建议让我完成上面描述的事情?
(虽然我意识到我可以通过将数据库连接从一个类传递到另一个类到另一个类到另一个子线程来解决问题,就像某种社区自行车一样,但我想避免这种情况。
前面有一个关于StackOverflow,InheritableThreadLocal和线程池的问题,也可以解决这个问题。但是,这个问题的解决方案似乎是,对于 InheritableThreadLocal 来说,这是一个糟糕的用例,我认为这不适用于我的情况。
感谢您的任何想法。