一、创建线程池时需要指定一个有意义的名字,否则出问题的时候就会难以定位。
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build(); 以上demo-pool-%d即为创建的线程名称,测试代码如下: public class Test { public static void main(String[] args) { ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build(); ExecutorService executorService = new ThreadPoolExecutor(10, 20, 200L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory); try { executorService.execute(() -> { try { Thread.sleep(1000); System.out.println("线程名称:" + Thread.currentThread().getName() ); throw new NullPointerException(); } catch (InterruptedException e) { e.printStackTrace(); } }); } catch (Exception e) { System.out.println("报错了" +e); } finally { //关闭 executorService.shutdown(); } } } 输出错误日志
Exception in thread "demo-pool-0" java.lang.NullPointerException
这里的demo-pool-0就是上面创建线程池时命名的名称。
二、创建线程池参数说明
1、corePoolSize : 线程池核心池的大小。
2、maximumPoolSize : 线程池的最大线程数。
3、keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间(空闲线程存活时间)。
4、unit : keepAliveTime 的时间单位。
5、workQueue : 存放提交但未执行任务的队列。
6、threadFactory : 创建线程的工厂类。
7、handler 等待队列满后的拒绝策略。
ExecutorService executorService = new ThreadPoolExecutor(10, 20, 200L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory);
三、创建线程池处理业务
public class Test { public static void main(String[] args) { ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build(); ExecutorService executorService = new ThreadPoolExecutor(10, 20, 200L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory); try { executorService.execute(() -> { try { Thread.sleep(1000); // 这里处理你的业务 System.out.println("balabalabalalalalalalala"); } catch (InterruptedException e) { e.printStackTrace(); } }); } catch (Exception e) { System.out.println("报错了" +e); } finally { //关闭 executorService.shutdown(); } } }