当前位置: 首页 > news >正文

网站开发的数据库技术影响网站速度因素 dns

网站开发的数据库技术,影响网站速度因素 dns,视频网站为什么有人做,视频推广方案文章目录概述ThreadPoolExecutorThreadPoolExecutor 的主要属性Worker 主要属性线程池的状态线程池的状态流转线程池提交任务的执行流程线程数量的设置线程池的种类FixedThreadPoolCachedThreadPoolSingleThreadExecutorScheduledThreadPoolExecutorSingleThreadScheduledExecu… 文章目录概述ThreadPoolExecutorThreadPoolExecutor 的主要属性Worker 主要属性线程池的状态线程池的状态流转线程池提交任务的执行流程线程数量的设置线程池的种类FixedThreadPoolCachedThreadPoolSingleThreadExecutorScheduledThreadPoolExecutorSingleThreadScheduledExecutorForkJoinPoolwork-stealingForkJoinPool 注意事项概述 线程池是资源池化思想的一种实现。线程是一种宝贵且有限的 CPU 资源一个线程的创建跟销毁的成本是比较高的。 所以创建线程池主要有以下两个目的 复用线程单个线程创建使用完毕后可以不用立马销毁而是把这个线程放入到线程池中等待下次执行任务管理线程线程是一种宝贵且有限的 CPU 资源其数量并不是无上限的 可以通过线程池来限制创建线程的数量也可以通过线程池来决定何时销毁冗余创建的线程在线程池中存在多个线程时可以通过线程池来协调每个线程的任务执行情况从而避免出现线程处于空闲状态造成线程资源的浪费 ThreadPoolExecutor ThreadPoolExecutor 是一个通用的线程池的实现类图如下所示 可以看到ThreadPoolExecutor 主要实现了 Executor、ExecutorService、AbstractExecutorService ThreadPoolExecutor 的主要属性 private final AtomicInteger ctl new AtomicInteger(ctlOf(RUNNING, 0));private final BlockingQueueRunnable workQueue;private final ReentrantLock mainLock new ReentrantLock();/*** Set containing all worker threads in pool. Accessed only when* holding mainLock.*/private final HashSetWorker workers new HashSetWorker();/*** Wait condition to support awaitTermination*/private final Condition termination mainLock.newCondition();/*** Tracks largest attained pool size. Accessed only under* mainLock.*/private int largestPoolSize;/*** Counter for completed tasks. Updated only on termination of* worker threads. Accessed only under mainLock.*/private long completedTaskCount;private volatile ThreadFactory threadFactory;/*** Handler called when saturated or shutdown in execute.*/private volatile RejectedExecutionHandler handler;/*** Timeout in nanoseconds for idle threads waiting for work.* Threads use this timeout when there are more than corePoolSize* present or if allowCoreThreadTimeOut. Otherwise they wait* forever for new work.*/private volatile long keepAliveTime;/*** If false (default), core threads stay alive even when idle.* If true, core threads use keepAliveTime to time out waiting* for work.*/private volatile boolean allowCoreThreadTimeOut;/*** Core pool size is the minimum number of workers to keep alive* (and not allow to time out etc) unless allowCoreThreadTimeOut* is set, in which case the minimum is zero.*/private volatile int corePoolSize;/*** Maximum pool size. Note that the actual maximum is internally* bounded by CAPACITY.*/private volatile int maximumPoolSize;/*** The default rejected execution handler*/private static final RejectedExecutionHandler defaultHandler new AbortPolicy();内置一个 AtomicInteger高 3 位用于表示线程池当前状态低 29 位用于表示线程个数内置一个阻塞队列用于核心线程都处于执行状态后保存任务内置一个 ReentrantLock 独占锁以及一个由锁对象创建出来的条件对象 Condition termination一个去重集合 HashSetWorker workers用于保存线程历史出现过的最多线程数量 int largestPoolSize已完成的任务数量 long completedTaskCount由 volatile 关键字修饰的线程组 ThreadFactory threadFactory由 volatile 关键字修饰的拒绝策略 RejectedExecutionHandler handler由 volatile 关键字修饰的空闲线程最大存活时间 long keepAliveTime由 volatile 关键字修饰的是否允许核心线程超时 boolean allowCoreThreadTimeOut由 volatile 关键字修饰的核心线程数量 int corePoolSize由 volatile 关键字修饰的最大线程数量 int maximumPoolSize默认的拒绝策略 new AbortPolicy()即默认的拒绝策略是抛出异常 Worker 主要属性 Worker 即工作线程。Worker 继承了 AQS 并实现了 Runnable 接口主要有以下几个属性 Thread thread线程对象Runnable firstTask首次执行的任务 线程池的状态 线程池一共有 5 个状态分别是 RUNNING运行状态接受新任务并且处理阻塞队列里的任务SHUTDOWN标记关闭状态拒绝新任务但是处理正在执行和阻塞队列里的任务STOP关闭状态拒绝新任务并且清空阻塞队列同时会中断所有线程TIDYING清场状态线程池和阻塞队列都为空将要调用 terminated() 方法TERMINATED终止状态。这是当 terminated() 方法调用完成之后的状态 线程池的状态流转 线程池一旦被创建就是 RUNNING 状态可以正常地执行任务以及接受新任务在 RUNNING 状态调用 shutdown() 方法后线程池就会切换到 SHUTDOWN 状态标记关闭状态下 遍历线程池当前所有空闲线程都会被调用 interrupt() 方法设置中断 被设置中断的线程将会从线程池中移除不再接受新任务新提交的任务将直接丢弃当前正在执行任务的线程把正在执行的任务继续完成且这些线程将会继续从阻塞队列中获取任务执行 在 RUNNING 或者 SHUTDOWN 状态调用 shutdownNow() 方法后线程池就会切换到 STOP 状态 不再接受新任务遍历线程池调用每个线程的 interrupt() 方法设置中断遍历阻塞队列移除所有任务 在 SHUTDOWN 或者 STOP 状态持续一段时间后当线程池中没有线程并且阻塞队列也为空后线程池将会切换到 TIDYING 状态TIDYING 状态将会做最后的收尾工作确保所有资源都被释放 线程池提交任务的执行流程 当有新任务提交时判断当前核心线程数是否小于最大核心线程数 如果小于最大核心线程数则创建一个新线程执行任务 如果大于核心线程数则尝试将任务提交到阻塞队列中 如果阻塞队列未满则将任务提交到阻塞队列中 如果阻塞队列已满则尝试开启新线程 如果当前线程数量小于最大线程数则创建一个新线程执行任务如果当前线程数量等于最大线程数则执行拒绝策略 AbortPolicy直接抛出异常CallerRunsPolicy由提交任务的线程执行DiscardPolicy直接丢弃任务DiscardOldestPolicy将阻塞队列队头的任务取出并丢弃然后重试提交 线程数量的设置 线程数量的经验计算公式为 线程数 CPU 核心数 *1 平均等待时间 / 平均工作时间线程池的种类 FixedThreadPool FixedThreadPool即固定数量线程池特点是核心线程数量 最大线程数量且阻塞队列容量较大甚至无界。 固定数量意味着线程不会频繁地创建和销毁在线程数量达到核心线程数量后在执行任务过程中没有发生异常的情况下线程数量将不会再发生变化阻塞队列容量非常大代表着任务可以被无条件地一直不断地添加进来可能会引发 GC 问题 当任务的执行速度远小于任务的添加速度时可能会导致阻塞队列中的节点数量特别巨大吃光堆内存空间导致 OOM FixedThreadExecutor 适用于计算密集型任务, 确保 CPU 在长时间被单个工作线程使用的情况下, 尽可能少地创建、分配、销毁线程, 即适用于长期且数量可控的任务。 CachedThreadPool CachedThreadPool即缓存线程池特点是 核心线程数量为 0意味着在线程池空闲时不会占用任何的线程资源最大线程数非常巨大意味着可以创建非常多的线程可能会导致系统线程资源耗尽的问题线程有较短的最大存活时间如 60s意味着每个工作线程的存活时间比较短阻塞队列不存储元素意味着每次有新任务提交时要么可以立马被一个空闲线程执行要么可以立马创建一个新线程执行去执行 CachedThreadPool 适用于存在数量多且耗时少的任务场景由于未限制线程最大数量在任务的执行速度远小于任务的添加速度时有可能会导致系统线程资源耗尽或引发 OOM。 SingleThreadExecutor SingleThreadExecutor即单线程线程池特点是 核心线程数量 最大线程数量 1意味着线程池中最多只会有一个线程意味着所有提交的任务都会被串行化执行任意时刻不会有同时两个任务在被同时执行阻塞队列容量非常大甚至无界代表着任务可以被无条件地一直不断地添加进来可能会引发 GC 问题 SingleThreadExecutor 适用于多个任务需要串行化执行的场景由于阻塞队列无界还是有可能引发 OOM。 注意Executors.newSingleThreadExecutor() 并不等价于 Executors.newFixedThreadPool(1)Executors 中的源码为 public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueueRunnable())); }可以看到newSingleThreadExecutor() 方法创建出来的 ThreadPoolExecutor 对象被包了一层 FinalizableDelegatedExecutorService所以这两者不等价 ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor是定时任务线程池可以使用它来实现定时任务主要的构造方法为 public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue());}可以看到ScheduledThreadPoolExecutor 的特点是 最大线程数无界空闲线程的最大存活时间为 0即在线程池不会存储空闲线程阻塞队列 DelayedWorkQueue 是一个底层数据结构为堆的延迟阻塞队列无界 SingleThreadScheduledExecutor SingleThreadScheduledExecutor 即单线程定时任务线程池可以保证所有定时任务都会由一个线程串行执行 ForkJoinPool ForkJoinPool是一个用于管理 ForkJoinWrokerThread 的线程池ForkJoin 是一种基于分治思想的并发编程框架通过将任务分解后使用多个线程并行计算最后合并所有子任务的计算结果得到最终的计算结果。 ForkJoinPool 线程池可以把一个大任务拆分成小任务并行执行但是任务类必须继承自 RecursiveTask 或者 RecursiveAction work-stealing 工作窃取算法work-stealing算法是指某个线程从其他队列里窃取任务来执行。主要实现的思路有一下几个关键点 每个工作者线程都会对应一个双端任务队列当某个工作者线程自己的任务队列中的任务执行完毕之后将会从其他工作者线程的任务队列里窃取任务出来执行工作者线程从自己的任务队列的头部来获取任务removeFirst工作者线程执行任务窃取时将从其他工作者线程的任务队列的尾部来获取任务removeLast ForkJoinPool 注意事项 任务类必须继承自 RecursiveTask 或者 RecursiveAction子任务间没有相互依赖任务最好不要包含阻塞 IO 操作
http://www.huolong8.cn/news/65112/

相关文章:

  • 怎么做套版网站广平企业做网站推广
  • 学校部门网站建设总结企业 北京 响应式网站
  • 北京哪里有做网站的廊坊智能模板建站
  • 优秀的学校网站欣赏电子商城网站开发文档
  • 老外做的汉语网站创建全国文明城市主题班会教案
  • 南昌网站建设和推广网站改版 大量旧页面
  • 九江专业制作网站小程序电商网络推广培训
  • 池州建行网站建设部网站注册人员
  • 搜索网站有哪些深圳市招聘网站
  • 支付网站建设费账务处理室内设计师常用网站
  • 开发建设网站需要什么人才wordpress 插件语言包
  • 福建网站建设公司局域网内建网站
  • 塘坑网站建设wordpress编辑器大家用什么
  • 一个网站建设的流程安庆市网站建设
  • 网站反链有好处吗中山网页模板建站
  • 长沙做网站公司深圳画册制作
  • 凡科建站怎么建网站可信网站图标 费流量
  • 推广一般去哪发帖上海关键词优化软件
  • 公司网站怎么做简介重庆建设网站的公司简介
  • 网页游戏网站模压板科技最狂潮
  • 网站购物系统制作雨辰资讯电子商务类网站开发北京学网站开发
  • 电商运营 网站运营接工程的app软件
  • 网站关键词排名检测工具西宁网站建设报价ew君博贴心
  • 画册设计公司网站衡阳网站建设 千度网络
  • 电商型网站开发多少钱潍坊建设公司网站
  • 新的网站建设技术网站怎么做下载内容
  • 婚礼网站建设重庆观音桥步行街
  • 微网站开发难吗留言 wordpress
  • 做的比较好的卡车网站工业电商网站怎么配色
  • 企业网站的目的怎么创建微信公众号免费