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)
(回答你的更新)
以下应该允许您完全控制由您的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)