**java 线程池中如何自定义每个线程名称
java 线程池中如何自定义每个线程名称
**
参考
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "我的线程 #" + mCount.getAndIncrement());
}
};
java线程池中管理的线程名称都是pool-1-thread-1这种规则的名称。
一个线程池的简单例子如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainController {
private ExecutorService executor = Executors.newFixedThreadPool(3);
public void submitTask(){
for(int i =0;i<10;i++){
executor.submit(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正处理");
}
});
}
//处理完成后关闭线程池
executor.shutdown();
}
public static void main(String[] args) {
MainController c = new MainController();
c.submitTask();
}
}
利用线程池执行10个任务,可以看到线程池中线程的名称的规律了。
补充下,线程池的创建线程池对象时,有一个参数是ThreadFactory类型,如果不传递,默认用的是DefaultFactory,我们可以自定义一个ThreadFactory然后作为参数传到进去,这个类里面就可以自定义线程池中创建的线程的名称。api:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName());
try {
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
mainMethods m=new mainMethods();
mainMethods m2=new mainMethods();
m.setName("m");
m2.setName("m2");
m.start();
m2.start();
}
这个简单啊:获取线程后进行判断,因为线程的线程池中的名字都是pool-1-thread-1,以最后一个数字进行数组存储名字,在每个线程里==判断进行区分名字;