【问题标题】:Sharing data between Runnable instances in same thread using ThreadPoolExecutor使用 ThreadPoolExecutor 在同一线程中的 Runnable 实例之间共享数据
【发布时间】:2014-12-14 13:17:19
【问题描述】:

我有一个在执行 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?

【问题讨论】:

标签: java concurrency threadpool runnable java.util.concurrent


【解决方案1】:

只是为了让这个问题可以被标记为已回答:

如果您没有其他理由使用自定义线程工厂(例如提供自定义线程名称),那么 ThreadLocal 是首选方式。它完全符合您对您想要实现的目标的描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多