มีRFE แบบเปิดสำหรับสิ่งนี้กับ Oracle จากความคิดเห็นจากพนักงาน Oracle ดูเหมือนว่าพวกเขาไม่เข้าใจปัญหาและจะไม่แก้ไข เป็นหนึ่งในสิ่งเหล่านี้ที่ตายง่าย ๆ ในการสนับสนุนใน JDK (โดยไม่ทำลายความเข้ากันได้ไปข้างหลัง) ดังนั้นจึงเป็นเรื่องน่าละอายที่ RFE เข้าใจผิด
เป็นแหลมออกคุณจำเป็นต้องใช้ของคุณเองThreadFactory หากคุณไม่ต้องการที่จะดึงใน Guava หรือ Apache Commons เพียงเพื่อวัตถุประสงค์นี้ฉันให้การThreadFactory
ใช้งานที่คุณสามารถใช้ที่นี่ มันคล้ายกับสิ่งที่คุณได้รับจาก JDK ยกเว้นความสามารถในการตั้งค่าส่วนนำหน้าชื่อเธรดเป็นอย่างอื่นที่ไม่ใช่ "พูล"
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;
}
}
เมื่อคุณต้องการที่จะใช้มันคุณก็สามารถใช้ประโยชน์จากความจริงที่ว่าทุกวิธีการช่วยให้คุณเพื่อให้คุณเองExecutors
ThreadFactory
นี้
Executors.newSingleThreadExecutor();
จะให้ ExecutorService โดยที่ชื่อเธรดมีpool-N-thread-M
แต่ใช้
Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("primecalc"));
คุณจะได้รับ ExecutorService primecalc-N-thread-M
ที่หัวข้อที่มีการตั้งชื่อ Voila!