<强> ThreadPoolExecutor 强>
ThreadPoolExecutor线程池,java提供开发框架,管理线程的创建,销毁,优化,监控等。
有4种不同的任务队列:
基于数组结构的任务队列。此队列按先进先出的原则对任务进行排序。
基于链表结构的任务队列。此队列也是按先进先出的原则对任务进行排序。但性能比ArrayBlockingQueue高。
不存储元素的任务队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。
具有优先级的任务队列。此队列中的元素必须能够比较。
<强>拒绝策略:强>
RejectedExecutionHandler(饱和策略):当线程池中的线程数大于maximumPoolSize时,线程池就不能在处理任何任务了,这时线程池会抛出异常。原因就是这个策略默认情况下是AbortPolicy:表示无法处理新任务时抛出异常。
1. abortpolicy:直接抛出异常。
2. callerrunspolicy:只用调用者所在线程来运行任务。
3. discardoldestpolicy:丢弃队列里最近的一个任务,并执行当前任务
4。DiscardPolicy:不处理,丢弃掉。
自定义:
ThreadPoolExecutor.AbortPolicy ()
引用>
//抛出java . util . concurrent。RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy ()
//重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy ()
//抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy ()
//抛弃当前的任务私有静态类RecjectThreadHandler实现RejectedExecutionHandler { @Override 公共空间rejectedExecution (Runnable r, ThreadPoolExecutor执行人){ }//异常记录 私人空间doLog (Runnable r, ThreadPoolExecutor执行人) { System.out.println (r.toString () +“excutor失败。”+ executor.getCompletedTaskCount ()); } }<>强创建线程工厂:强>
用来创建线程。
公共类ThreadFactory CheckThreadFactory实现 { 私人字符串threadGroupName; 私人AtomicInteger数=new AtomicInteger (0); 公共CheckThreadFactory(字符串threadGroupName) { 这一点。threadGroupName=threadGroupName; } @Override 公共线程newThread (Runnable r) { 线程的线程=新线程(r); thread.setName (threadGroupName +“-”+ count.addAndGet (1)); thread.setPriority (5); thread.setDaemon(真正);。//设置为守护线程,默认为主线程 返回线程; } }<强>线程工具类:强>
/* * * @author唐纳德 * @create 2019-09-21 21:40 */公开课CheckExcetPool {//线程池核心线程数 私有静态int corePoolSize=Runtime.getRuntime () .availableProcessors () * 5;//最大线程数 私有静态int maximumPoolSize=corePoolSize比;255 & # 63;255:corePoolSize * 2;//线程池中除了核心线程,其他线程的最大存活时间 私有静态int keepAliveTime=60;//时间单位 私有静态TimeUnit TimeUnit=TimeUnit.SECONDS;//线程等待队列 私有静态BlockingQueue队列=new LinkedBlockingQueue ();//私有静态BlockingQueue队列=new ArrayBlockingQueue(30);//创建线程的工厂 私有静态CheckThreadFactory CheckThreadFactory=new CheckThreadFactory (“checkGroup”);//拒绝策略当提交任务数超过maxmumPoolSize +工作队列之和时,//*即当提交第41个任务时(前面线程都没有执行完,此测试方法中用睡眠(100)),//*任务会交给RejectedExecutionHandler来处理/*处理程序的拒绝策略: 有四种:第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满 第二种DisCardPolicy:不执行新任务,也不抛出异常 第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行 第四种CallerRunsPolicy:直接调用执行来执行当前任务*/私有静态ThreadPoolExecutor ThreadPoolExecutor=new ThreadPoolExecutor ( corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, 队列, checkThreadFactory ); 公共静态空提交(Runnable Runnable) { System.out.println (corePoolSize +“::”+ queue.size ()); threadPoolExecutor.submit(可运行); } 公共静态& lt; T>未来的提交(Callable ThreadPoolExecutor线程池的使用方法