为什么Java工作窃取池(ForkJoinPool)不支持从线程池中预先创建的线程?

Executors.newWorkStealingPool()允许创建具有目标并行性的有限并发池.在幕后,似乎使用默认工作程序创建工厂创建了一个新的ForkJoinPool,该工厂定义为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需要实现以返回具有给定Runnable的线程,但是Thread API仅允许由Thread构造函数设置Runnable.

>在Thread中修复此问题将破坏模型. (替换已启动的线程的Runnable是什么意思.)
>从理论上讲,可以通过定义Thread的子类来修复该问题,其中实际的run()方法在循环中运行用户提供的Runnable.但这变得很复杂….,您将只能回收该子类的实例…而不能回收任意线程.

上一篇:java – CompletableFuture allof(..).join()vs CompletableFuture.join()


下一篇:C#线程池 ThreadPool