是不是可以为ForkJoinPool提供线程库或名称模式?

cpz*_*cpz 8 java java.util.concurrent

我想为工作窃取池使用的ForkJoinPool的线程设置名称,由.提供

ExecutorService newWorkStealingPool(int parallelism)
Run Code Online (Sandbox Code Playgroud)

要么

ExecutorService newWorkStealingPool()
Run Code Online (Sandbox Code Playgroud)

到目前为止,我找不到在这个线程上设置自定义名称ExecutorService的方法,有没有办法?

newWorkStealingPool()基本上提供了一个ForkJoinPool,但ForkJoinPool也没有提供名称模式的公共构造函数.

更新:我现在发现这个构造函数 ForkJoinPool需要一个线程工厂ForkJoinPool.ForkJoinWorkerThreadFactory.但是工厂应该返回a ForkJoinWorkerThread,它没有公共构造函数.所以我想我必须继承ForkJoinWorkerThread.

Mor*_*sen 24

这似乎是所需的最低代码,重用现有的默认工厂:

final ForkJoinWorkerThreadFactory factory = new ForkJoinWorkerThreadFactory()
{
    @Override           
    public ForkJoinWorkerThread newThread(ForkJoinPool pool)
    {
        final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
        worker.setName("my-thread-prefix-name-" + worker.getPoolIndex());
        return worker;
    }
};

forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), factory, null, false); 
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了一个例子,worker.getPoolIndex() 总是返回零。 (6认同)
  • @k.liakos你是对的。我认为您不能在池启动之前调用“worker.getPoolIndex()”。在任何情况下,您都可以创建一个静态“AtomicLong”字段并使用“AtomicLong.getAndIncrement()”生成 ID。 (2认同)

Gus*_*Gus 5

(回答你的更新)

以下应该允许您完全控制由您的ForkJoinPools产生的线程。就我而言,我希望能够做“危险”的事情,比如访问系统属性。默认实现使用java.util.concurrent.ForkJoinWorkerThread.InnocuousForkJoinWorkerThread它具有安全管理器和零权限。

public class MyForkJoinThreadFactory implements ForkJoinPool.ForkJoinWorkerThreadFactory {
  @Override
  public ForkJoinWorkerThread newThread(ForkJoinPool pool) {
    return new NotSoInnocuousWorkerThread(pool);
  }
}
Run Code Online (Sandbox Code Playgroud)

和工作线程(现在与您的应用程序的其余部分具有相同的权限,就像这样,加上您想要的任何其他内容......

public class NotSoInnocuousWorkerThread extends ForkJoinWorkerThread {
  protected NotSoInnocuousWorkerThread(ForkJoinPool pool) {
    super(pool);
  }
}
Run Code Online (Sandbox Code Playgroud)

您需要传递以下属性或在您的代码中设置它,如下所示:

System.setProperty("java.util.concurrent.ForkJoinPool.common.threadFactory", 
                   MyForkJoinThreadFactory.class.getName());
Run Code Online (Sandbox Code Playgroud)