Bir var açık RFE Oracle ile bunun için. Oracle çalışanından gelen yorumlardan, sorunu anlamadıkları ve düzeltilmeyecekleri anlaşılıyor. JDK'da desteklenmesi son derece basit olan şeylerden biri (geriye dönük uyumluluğu bozmadan), bu nedenle RFE'nin yanlış anlaşılması utanç verici.
Belirtildiği gibi kendi ThreadFactory'nizi uygulamanız gerekir . Guava veya Apache Commons'ı sadece bu amaçla çekmek istemiyorsanız, burada kullanabileceğiniz bir ThreadFactory
uygulama sağlarım. İş parçacığı adı önekini "havuz" dan başka bir şeye ayarlama yeteneği dışında JDK'dan aldığınıza tam olarak benzer.
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;
}
}
Kullanmak istediğinizde, tüm Executors
yöntemlerin kendinize ait olmasını sağlamanızdan faydalanabilirsiniz ThreadFactory
.
Bu
Executors.newSingleThreadExecutor();
iş parçacığı adlandırılmış pool-N-thread-M
ancak kullanarak bir ExecutorService verecektir
Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("primecalc"));
iş parçacıklarının adlandırıldığı bir ExecutorService alırsınız primecalc-N-thread-M
. İşte bu kadar!