【发布时间】:2012-02-19 04:58:20
【问题描述】:
我正在尝试同时使用InheritableThreadLocal 和ThreadPoolExecutor。
这是因为ThreadPoolExecutor 为每个池重用线程(毕竟它是一个池),这意味着InheritableThreadLocal 不能按预期工作。现在这个问题对我来说似乎很明显,但追踪起来特别难。
我使用InheritableThreadLocal,这样几个顶级进程中的每一个都有自己的数据库连接以及它产生的任何子进程。我不只使用一个共享连接池,因为每个顶级进程在提交到数据库和/或准备大量反复使用的 PreparedStatement 之前都会对其连接执行大量多步骤工作。
我在这些顶级进程之间使用共享的ThreadPoolExecutor,因为有些行为需要被限制。例如即使我可能有 4 个顶级进程正在运行,但我一次只能让任何一个进程写入数据库(或者系统需要对其他共享资源进行门控)。因此,我将让顶级进程创建一个 Runnable 并将其发送到共享的 ThreadPoolExecutor 以确保不超过一个(或两个或三个,视情况而定)同时运行整个系统。
问题在于,因为ThreadPoolExecutor 将其线程重用于池,InheritableThreadLocal 正在获取在该池中运行的原始值,而不是在发送可运行到ThreadPoolExecutor。
有什么方法可以强制
ThreadPoolExecutor中的工作池使用在创建 Runnable 的进程上下文中的InheritableThreadLocal值,而不是在重用线程池的上下文中?或者,是否有任何
ThreadPoolExecutor的实现在每次启动新的 Runnable 时创建一个新线程?出于我的目的,我只关心将同时运行的线程数控制为固定大小。人们是否有任何其他解决方案或建议可以让我完成我上面描述的事情?
(虽然我意识到我可以通过在类到类到子线程到子线程之间传递数据库连接来解决问题,就像某种社区自行车一样,但我想避免这种情况。)
StackOverflow 上有一个先前的问题InheritableThreadLocal and thread pools,也解决了这个问题。但是,该问题的解决方案似乎是 InheritableThreadLocal 的用例很差,我认为这不适用于我的情况。
感谢您的任何想法。
【问题讨论】:
标签: java multithreading executorservice