为什么 Java 工作窃取池 (ForkJoinPool) 不支持从线程池中预创建线程?
Why does Java work stealing pool (ForkJoinPool) not support pre-created threads from a thread pool?
Executors.newWorkStealingPool() allows creating a limited concurrency pool with target parallelism. Under the hood, it seems to create a new ForkJoinPool with default worker creation factory which is defined here.
该工厂似乎会创建新线程,直到达到所需的并发数。为什么这个池不允许使用现有池中的线程子集来支持有限的并发性,同时仍然避免每次都创建新线程?我假设在 Java.
中创建线程是昂贵的
相关:Use only a subset of threads in an ExecutorService
Why does this pool not allow using a subset of threads from an existing pool to support limited concurrency while still avoiding creation of new threads everytime?
Thread
和 ThreadFactory
API 不允许您回收任意 Thread
对象。问题是 ThreadFactory::newThread
需要实现 return 具有给定 Runnable
的线程,但是 Thread
API 只允许 Runnable
由 Thread
构造函数设置。
在 Thread
中解决这个问题会破坏模型。 (替换已经启动的线程的Runnable
是什么意思。)
理论上可以通过定义 Thread
的子类来修复,其中实际的 run()
方法在循环中运行用户提供的 Runnable
。但它变得复杂....你只能回收该子类的实例......而不是任意线程。
Executors.newWorkStealingPool() allows creating a limited concurrency pool with target parallelism. Under the hood, it seems to create a new ForkJoinPool with default worker creation factory which is defined here.
该工厂似乎会创建新线程,直到达到所需的并发数。为什么这个池不允许使用现有池中的线程子集来支持有限的并发性,同时仍然避免每次都创建新线程?我假设在 Java.
中创建线程是昂贵的相关:Use only a subset of threads in an ExecutorService
Why does this pool not allow using a subset of threads from an existing pool to support limited concurrency while still avoiding creation of new threads everytime?
Thread
和 ThreadFactory
API 不允许您回收任意 Thread
对象。问题是 ThreadFactory::newThread
需要实现 return 具有给定 Runnable
的线程,但是 Thread
API 只允许 Runnable
由 Thread
构造函数设置。
在
Thread
中解决这个问题会破坏模型。 (替换已经启动的线程的Runnable
是什么意思。)理论上可以通过定义
Thread
的子类来修复,其中实际的run()
方法在循环中运行用户提供的Runnable
。但它变得复杂....你只能回收该子类的实例......而不是任意线程。