1、调ThreadPoolExecutor 创建线程池executor,传入了ThreadFactory工程用于创建线程。
public static ThreadPoolExecutor namedFixMaxThreadPool( final String groupName, final int max, final int qsize) { return namedFixMaxThreadPool(groupName, max, qsize, new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { logger.error(groupName + "rejected execution"); } }); } public static ThreadPoolExecutor namedFixMaxThreadPool( final String groupName, final int max, int qsize, RejectedExecutionHandler handler) { return new ThreadPoolExecutor(5, max, 1L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(qsize), new ThreadFactory() { private AtomicInteger num = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setName(groupName + " - " + num.incrementAndGet()); return thread; } }, handler); } //new ThreadFactory是创建线程池里面的线程。
public static ThreadPoolExecutor getHisThreadPool(String name){ ThreadPoolExecutor executor = threadExcutor.get(name); if(executor == null){ executor = ThreadPoolExecutorUtil.namedFixMaxThreadPool(name, 6, 3); threadExcutor.put(name, executor); } executor.execute(new Runnable() { @Override public void run() { } });
2、线程池调用任务(任务需要实现Runnable接口,并且这个是任务而不是线程池里面所创
建的线程)
ThreadPoolExecutor poolExecutor = ThreadPoolExecutorUtil.getHisThreadPool("updateHeartBeat"); //往线程池里面添加任务执行 poolExecutor.execute(new Runnable() { @Override public void run() { deviceMapper.updateHeartBeatTime(id); } });
4.任务缓存队列及排队策略
在前面我们多次提到了任务缓存队列,即workQueue,它用来存放等待执行的任务。
workQueue的类型为BlockingQueue<Runnable>,通常可以取下面三种类型:
1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;
2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。
线程池的详细讲解:https://fangjian0423.github.io/2016/03/22/java-threadpool-analysis/