Có một RFE mở cho điều này với Oracle. Từ các ý kiến từ nhân viên của Oracle, có vẻ như họ không hiểu vấn đề và sẽ không khắc phục. Đây là một trong những điều rất đơn giản để hỗ trợ trong JDK (không phá vỡ tính tương thích ngược), vì vậy thật đáng tiếc khi RFE bị hiểu lầm.
Như đã chỉ ra, bạn cần triển khai ThreadFactory của riêng mình . Nếu bạn không muốn sử dụng Guava hoặc Apache Commons chỉ cho mục đích này, tôi cung cấp ở đây một ThreadFactory
triển khai mà bạn có thể sử dụng. Nó hoàn toàn giống với những gì bạn nhận được từ JDK ngoại trừ khả năng đặt tiền tố tên luồng thành một thứ khác ngoài "pool".
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;
}
}
Khi bạn muốn sử dụng nó, bạn chỉ cần tận dụng thực tế là tất cả các Executors
phương pháp cho phép bạn cung cấp cho riêng bạn ThreadFactory
.
Điều này
Executors.newSingleThreadExecutor();
sẽ cung cấp một ExecutorService nơi các chủ đề được đặt tên pool-N-thread-M
nhưng bằng cách sử dụng
Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("primecalc"));
bạn sẽ nhận được một ExecutorService nơi các chủ đề được đặt tên primecalc-N-thread-M
. Voila!