兼职做网站的费用,网络公司专业做网站,怎么做晒鱼的网站,网上购物商城网站何谓线程池#xff1f;本人理解是存放和管理线程的一个容器。
线程池存在的意义是什么#xff1f;
第一#xff1a;前面博客提到过创建和销毁线程的操作本身是有性能开销的#xff0c;如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本本人理解是存放和管理线程的一个容器。
线程池存在的意义是什么
第一前面博客提到过创建和销毁线程的操作本身是有性能开销的如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本使用越频繁就越能节省性能毕竟省到就是赚到嘛。
第二方便的管理线程避免很多线程同时争抢资源引发阻塞。毕竟是人家封装过的因此有专门的属性参数来控制核心线程数、最大并发数、非核心线程的最大限制时长等。 这篇文章内容计划分两部分
介绍常用的四种线程池
线程池种一些常用的属性参数 Android常用的四种线程池
//线程池 - 固定线程的
ExecutorService fixedThreadPool Executors.newFixedThreadPool(2);//线程池 - 缓存的
ExecutorService cachedThreadPool Executors.newCachedThreadPool();
//线程池 -
ScheduledExecutorService scheduledThreadPool Executors.newScheduledThreadPool(2);
//比较特殊不是以ThreadPool结尾
ExecutorService singleThreadExecutor Executors.newSingleThreadExecutor(); 第一种FixedThreadPool线程数量固定的线程池它只有核心线程。物以稀为贵只要线程池不销毁线程就不会被回收。当所有的线程都处于活动状态时新任务都会处于等待状态直到有线程空闲出来。所有的都是核心线程因此都是精英时刻准备着能够更快速地响应外界的请求。
第二种CachedThreadPool线程数量不固定的线程池没有核心线程全都是非核心线程并且最大线程数为Integer.MAX_VALUE超时时间为60s。当线程池中所有线程都处于活动状态时线程池会创建新的线程来处理新任务否则就会复用空闲线程来处理,线程空闲超过60秒会被回收。比较适合执行量大但耗时较少的任务。当所有线程都处于闲置状态时线程池中的线程都会超时而被停止这时CacheThreadPool几乎不占任何系统资源。
第三种 ScheduledThreadPool总体线程数量不固定的线程池核心线程数固定非核心线程无限大非核心线程闲置时会被立即回收。ScheduledThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务。
第四种 SingleThreadExecutor线程数量固定的线程池只有一个核心线程并且无超时时间。内部只有一个核心线程它确保所有的任务都在同一个线程中按顺序执行。用于统一外界所有任务到一个线程这使得这些任务之间不需要处理线程同步的问题。
线程池种一些常用的属性参数
相信大家都见过一定这样一句话“Android线程池的概念来源于Java的Executor接口”但实际我们创建线程池直接使用的Executors这个类但但是线程池的真正实现是ThreadPoolExecutor类。因为看上面四种线程池都是通过调用Executors的四个静态方法来实现的点进去就会发现它也是创建的ThreadPoolExecutor对象。 通过代码看一下ThreadPoolExecutor类继承关系 它提供了一系列参数来配置线程池通过不同的参数可以创建不同的线程池。 以下是各个参数的具体含义
①CorePoolSize线程池的核心线程数
默认情况下核心线程会一直存活即使它们处于闲置状态。但是如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true那么核心线程就会存在超时策略这个时间间隔由keepAliveTime决定当等待时间超过keepAliveTime时长后核心线程就会被停止。
②maximumPoolSize线程池能容纳的最大线程数
当活动线程数达到这个数值后后续的新任务将会被阻塞。
③keepAliveTime非核心线程闲置时的超时时长
超过这个时长非核心线程就会被回收当线程池的allowCoreThreadTimeOut属性设置为True时keepAliveTime同样会作用于核心线程。
④unitkeepAliveTime参数的时间单位是个枚举值秒、毫秒、分钟
⑤workQueue线程池中的任务队列通过线程池execute方法提交的Runnable对象会存储在该队列中。该任务队列是BlockingQueue类型属于阻塞队列即队列为空时取出任务的操作会被阻塞只有队列不为空时才能进行取出操作而在满队列时添加操作会被阻塞。
⑥threadFactory线程工厂作用是为线程池提供创建新线程的能力。ThreadFactory是一个接口它只有一个方法newThread(Runnable r用来创建线程。 线程池常用方法
shutDown() 关闭线程池不影响已经提交的任务会等它完成
shutDownNow() 立刻关闭线程池并尝试去终止正在执行的线程
allowCoreThreadTimeOut(boolean value) 允许核心线程闲置超时时被回收
execute提交任务
submit 一般情况下我们使用execute来提交任务但是有时候可能也会用到submit使用submit的好处是submit有返回值。
粗糙一点来讲execute(runnable)提交任务时会进行以下操作不是绝对的哈因为有的压根就没有核心线程、又得有没有非核心线程。我们可以理解一下它的思想就是先核心线程-满了就排队-排队人也太多了就非核心线程-线程总数也超了就抛异常
①如果线程池中运行的线程数少于核心线程数就新建一个线程并执行该任务。
②如果线程池中运行的线程数大于等于核心线程数则将任务添加到执行队列中排队等待执行
③如果连添加执行队列都失败了那估计是真满了此时新建一个非核心线程并在该线程执行任务 这一步得看情况哈前提是你的线程池可以有非核心线程并且数量未超过最大值
④如果添加执行队列都失败并且当前线程总数已经达到最大线程数就拒绝这个任务抛出RejectedExecutionHandler异常。
才疏学浅如有错误欢迎指正多谢。