目的:有时候为了快速定位出现错误的位置,在采用线程池时我们需要自定义线程池的名称。
1、创建ThreadFactory(ThreadPoolExecutor默认采用的是DefaultThreadFactory,可以参照代码)。
public class NamedThreadFactory implements ThreadFactory{ private final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup threadGroup; private final AtomicInteger threadNumber = new AtomicInteger(1); public final String namePrefix; NamedThreadFactory(String name){ SecurityManager s = System.getSecurityManager(); threadGroup = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); if (null==name || "".equals(name.trim())){ name = "pool"; } namePrefix = name +"-"+ poolNumber.getAndIncrement() + "-thread-"; } @Override public Thread newThread(Runnable r) { Thread t = new Thread(threadGroup, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t; } }
2、创建线程池
static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,1, TimeUnit.MINUTES,new LinkedBlockingDeque<>(),new NamedThreadFactory("测试"));
3、测试代码
static ThreadLocal<SimpleDateFormat>threadLocal = new ThreadLocal<SimpleDateFormat>(){ @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; public static void main(String[] args) { threadPoolExecutor.execute(new Runnable() { @Override public void run() { try { System.out.println(threadLocal.get().parse("2019-10-22 16:59:00")); throw new NullPointerException("sfa"); } catch (ParseException e) { e.printStackTrace(); } } }); }
4、结果