【发布时间】: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?
【问题讨论】:
-
您应该使用 ThreadLocal 而不是使用自定义线程。 docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html
标签: java concurrency threadpool runnable java.util.concurrent