Dafür gibt es bei Oracle eine offene RFE . Aus den Kommentaren des Oracle-Mitarbeiters geht hervor, dass er das Problem nicht versteht und es nicht beheben kann. Es ist eines dieser Dinge, das im JDK kinderleicht zu unterstützen ist (ohne die Abwärtskompatibilität zu beeinträchtigen). Es ist also eine Schande, dass die RFE missverstanden wird.
Wie bereits erwähnt, müssen Sie Ihre eigene ThreadFactory implementieren . Wenn Sie Guava oder Apache Commons nicht nur für diesen Zweck verwenden möchten, stelle ich hier eine ThreadFactory
Implementierung zur Verfügung, die Sie verwenden können. Es ist genau dem ähnlich, was Sie vom JDK erhalten, mit der Ausnahme, dass das Thread-Namenspräfix auf etwas anderes als "Pool" gesetzt werden kann.
package org.demo.concurrency;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
/**
* ThreadFactory with the ability to set the thread name prefix.
* This class is exactly similar to
* {@link java.util.concurrent.Executors#defaultThreadFactory()}
* from JDK8, except for the thread naming feature.
*
* <p>
* The factory creates threads that have names on the form
* <i>prefix-N-thread-M</i>, where <i>prefix</i>
* is a string provided in the constructor, <i>N</i> is the sequence number of
* this factory, and <i>M</i> is the sequence number of the thread created
* by this factory.
*/
public class ThreadFactoryWithNamePrefix implements ThreadFactory {
// Note: The source code for this class was based entirely on
// Executors.DefaultThreadFactory class from the JDK8 source.
// The only change made is the ability to configure the thread
// name prefix.
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
/**
* Creates a new ThreadFactory where threads are created with a name prefix
* of <code>prefix</code>.
*
* @param prefix Thread name prefix. Never use a value of "pool" as in that
* case you might as well have used
* {@link java.util.concurrent.Executors#defaultThreadFactory()}.
*/
public ThreadFactoryWithNamePrefix(String prefix) {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup()
: Thread.currentThread().getThreadGroup();
namePrefix = prefix + "-"
+ poolNumber.getAndIncrement()
+ "-thread-";
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon()) {
t.setDaemon(false);
}
if (t.getPriority() != Thread.NORM_PRIORITY) {
t.setPriority(Thread.NORM_PRIORITY);
}
return t;
}
}
Wenn Sie es verwenden möchten, nutzen Sie einfach die Tatsache, dass Sie mit allen Executors
Methoden Ihre eigenen bereitstellen können ThreadFactory
.
Dies
Executors.newSingleThreadExecutor();
gibt einen ExecutorService, in dem Threads benannt werden, pool-N-thread-M
aber mit
Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("primecalc"));
Sie erhalten einen ExecutorService, in dem Threads benannt sind primecalc-N-thread-M
. Voila!