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

阿里巴巴吧国际网站怎么做永川做网站的

阿里巴巴吧国际网站怎么做,永川做网站的,怎么做专门卖二手衣服的网站,机关单位网站建设的重要性线程池核心概述 Executors工厂类使用 Executors工厂类底层源码分析详解 ThreadPoolExecutor自定义线程池 ThreadPoolExecutor拒绝策略详解 计算机密集型与IO密集型详解 如何正确的使用线程池…线程池核心概述 Executors工厂类使用                        Executors工厂类底层源码分析详解                ThreadPoolExecutor自定义线程池                ThreadPoolExecutor拒绝策略详解                计算机密集型与IO密集型详解            如何正确的使用线程池 线程池初步 线程池一般高并发其实是一个非常抽象的概念要实现高并发其实不仅仅是一个JAVA 线程集合类、或者JAVA基础层面就能搞定的事情在互联网大厂中高并发其实涉及方方面面从前端到后端到支持高并发的中间组件redis、zookeper等最后到数据存储持久化层面等等都需要对高并发做一些考量和设计管理控制首先从管理角度就是为了更好的控制线程使用线程池来帮助我们去管理线程使得我们对线程的生命周期、初始化、运行状态、销毁等各个环节有一个把控系统资源另外一点从系统资源的角度考虑线程池可以控制线程的数量根据任务的多少去对线程池中的线程个数进行添加或者减少可以回收空闲状态的线程减少线程的频繁初始化和销毁避免不必要的系统开销节省系统资源保障稳定性应用性能从性能的角度去考虑线程池可以配合高并发容器的设置对任务和工作项进行缓存异步的多线程的去处理任务从而提高应用服务的吞吐率、消费性能也从而提高单个线程的利用率兜底策略从健壮性的角度去分析线程池提供了很多拒绝策略我们在任务过多或者处理不过来的时候可以进行有效的拒绝策略、降级方案以补偿的形式进行处理任务避免因为线程池的问题对系统产生较为严重的影响 Executors JDK提供了一套线程框架Executors存储在java.util.concurrent包中是JDK并发包的核心Executors线程工厂的角色通过Executors可以创建特定功能的线程池 Executors创建线程池的方法 newFixedThreadPool()方法该方法返回一个固定数量的线程池该方法的线程数始终不变当有一个任务提交时若线程池中空闲则立即执行若没有则会被暂缓在一个任务队列中等待有空闲的线程去执行newSingleThreadPool ()方法创建一个线程的线程池若空闲则执行若没有空闲线程则暂缓在任务列队中newCachedThreadPool()方法返回一个可根据实际情况调整线程个数的线程池不限制最大线程数量若有任务则创建线程若无任务则不创建线程。如果没有任务则线程在60s后自动回收空闲时间60snewScheduledThreadPool()方法该方法返回一个SchededExecutorService对象但该线程池可以指定线程的数量 自定义线程池ThreadPoolExecutor 自定义线程池若Executors工厂无法满足我们的需求可以自己创建自定义线程池其实Executors工厂类里面的创建线程方法其内部实现均是用了ThreadPoolExecutor这个类这个类可以自定义线程。构造方法如下 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueRunnable workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) 使用有界队列在使用有界队列时若有新的任务需要执行如果线程池实际线程数小于corePoolSize则优先创建线程若大于corePoolSize则会将任务加入队列若队列已满则在总线程数不大于maximumPoolSize的前提下创建新的线程若线程数大于maximumPoolSize则执行拒绝策略。或其他自定义方式使用无界队列在使用无界队列时LinkedBlockingQueue。与有界队列相比除非系统资源耗尽否则无界的任务队列不存在任务入队失败的情况。当有新任务到来系统的线程数小于corePoolSize时则新建线程执行任务。当达到corePoolSize后就不会继续增加。若后续仍有新的任务加入而有没有空闲的线程资源则任务直接进入队列等待。若任务创建和处理的速度差异很大无界队列会保持快速增长直到耗尽系统内存 线程池的拒绝策略 AbortPolicy直接抛出异常阻止系统正常工作CallerRunsPolicy只要线程池未关闭该策略直接在调用者线程中运行当前被丢弃的任务DiscardOldestPolicy丢弃最老的一个请求尝试再次提交当前任务DiscardPolicy丢弃无法处理的任务不给予任何处理如果需要自定义拒绝策略可以实现RejectedExecutionHandler接口 //RejectedExecutionHandler接口 public class MyRejected implements RejectedExecutionHandler{public MyRejected(){}Overridepublic void rejectExecution(Runnable r,ThreadPoolExecutor executor){} } 如何使用好线程池 线程个数大小的设置线程池相关参数配置利用Hook嵌入你的行为线程池的关闭 线程池大小设置计算密集型/IO密集型 计算密集型 顾名思义就是应用需要非常多的CPU计算资源在多核CPU时代我们要让每一个CPU核心都参与计算将CPU的性能充分利用起来这样才算是没有浪费服务器配置如果在非常好的服务器配置上还运行着单线程程序那将是多么重大的浪费。对于计算密集型的应用完全是靠CPU的核数来工作所以为了让它的优势完全发挥出来避免过多的线程上下文切换。比较理想方案是 线程数 CPU核数1也可以设置成CPU核数*2但还要看JDK的版本以及CPU配置(服务器的CPU有超线程)IO密集型 就很好理解了我们现在做的开发大部分都是WEB应用涉及到大量的网络传输不仅如此与数据库与缓存间的交互也涉及到IO一旦发生IO线程就会处于等待状态当IO结束数据准备好后线程才会继续执行。因此从这里可以发现对于IO密集型的应用我们可以多设置一些线程池中线程的数量这样就能让在等待IO的这段时间内线程可以去做其它事提高并发处理效率。那么这个线程池的数据量是不是可以随便设置呢当然不是的请一定要记得线程上下文切换是有代价的。目前总结了一套公式对于IO密集型应用 线程数 CPU核心数/(1-阻塞系数) 这个阻塞系数一般为0.8~0.9之间也可以取0.8或者0.9。 套用公式对于双核CPU来说它比较理想的线程数就是20当然这都不是绝对的需要根据实际情况以及实际业务来调整final int poolSize (int)(cpuCore/(1-0.9)) 线程池相关参数配置注意事项 避免线上操作数据库查询、修改都很麻烦使用线程池的时候都不要选择没有上限限制的配置项不要使用没有上限的线程池和设置无界队列newCachedThreadPool的设置与无界队列的设置因为某些不可预期的情况线程池会出现系统异常导致线程暴增的情况或者任务队列不断膨胀内存耗尽导致系统崩溃和异常。 我们推荐使用自定义线程池来避免该问题这也是在使用线程池规范的首要原则合理设置线程数量、和线程空闲回收时间根据具体的任务执行周期和时间去设定避免频繁的回收和创建虽然我们使用线程池的目的是为了提升系统性能和吞吐量但是也要考虑下系统的稳定性不然出现不可预期问题会很麻烦根据实际场景选择适用于自己的拒绝策略。进行补偿不要乱用JDK支持的自动补偿机制尽量采用自定义的拒绝策略去进行兜底 利用Hook嵌入你的行为 利用Hook留下线程池执行轨迹例如ThreadPoolExecutor提供了protected类型可以被覆盖的钩子方法允许用户在任务执行之前会执行之后做一些事情。我们可以通过它来实现比如初始化ThreadLocal、收集统计信息、如记录日志等操作。这类Hook如beforeExecute和afterExecute。另外还有一个Hook可以用来在任务被执行完的时候让用户插入逻辑如rerminated如果hook方法执行失败则内部的工作线程的执行将会失败或被中断 ​​​​​​​关闭线程池 内容当线程池不在被引用并且工作线程数为0的时候线程池将被终止。我们也可以调用shutdown来手动终止线程池。如果我们忘记调用shutdown为了让线程资源被释放我们还可以使用keepAliveTime和allowCoreThreadTimeOut来达到目的当然稳妥的方式是使用虚拟机Runtime.getRuntime().addShutdownHook方法手工去调用线程池的关闭方法 相关代码 package com.bfxy.thread.core.pool;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;public class UseThreadPoolExecutor {public static void main(String[] args) {ThreadPoolExecutor pool new ThreadPoolExecutor(1, // corePoolSize: 核心线程数,线程池初始化的时候就会被创建3, // maximumPoolSize: 线程池的最大上限 //在使用无界队列的时候, 此参数 不起作用60, //线程的存活时间TimeUnit.SECONDS,//workQueueBlockingQueue接口下面的实现类//new ArrayBlockingQueue(2), //使用有界队列: ArrayBlockingQueuenew LinkedBlockingQueue(), //使用无界队列: LinkedBlockingQueuenew ThreadFactory() { //threadFactory 线程工厂, 用于获取一个新的线程, 然后把该线程 投递到我们的线程池中去Overridepublic Thread newThread(Runnable r) {Thread th new Thread(r, order-thread);if(th.getPriority() ! Thread.NORM_PRIORITY) {th.setPriority(Thread.NORM_PRIORITY);}if(th.isDaemon()) {th.setDaemon(false);}return th;}}, //使用无界队列时, 拒绝策略不起到作用new RejectedExecutionHandler() {Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.err.println(当前的任务已经被拒绝: r.toString());}});Task t1 new Task(1);Task t2 new Task(2);Task t3 new Task(3);Task t4 new Task(4);Task t5 new Task(5);Task t6 new Task(6);/**//线程池提交任务的方法:pool.execute(t1); //execute: 如果你的任务没有返回值, 则使用该方法提交任务pool.submit(t1); //submit: 如果你的任务有返回值, 则使用该方法提交任务, 返回一个Future对象(Future模式)*//*** * 在使用有界队列时:* 1 若有新的任务需要执行如果线程池实际线程数小于corePoolSize则优先创建线程* 2 若大于corePoolSize则会将任务加入队列* 3 若队列已满则在总线程数不大于maximumPoolSize的前提下创建新的线程* 4 若线程数大于maximumPoolSize则执行拒绝策略。*/// 1 若有新的任务需要执行如果线程池实际线程数小于corePoolSize则优先创建线程pool.execute(t1); //core size 1 t1任务会被核心线程执行// 2 若大于corePoolSize则会将任务加入队列pool.execute(t2); // 有界队列容量为: 2pool.execute(t3);// 3 若队列已满则在总线程数不大于maximumPoolSize的前提下创建新的线程, 并执行该任务pool.execute(t4); // 线程池中的总线程数 2 , maximumPoolSize 3 pool.execute(t5); // 线程池中的总线程数 3 , maximumPoolSize 3 // 4 若线程数大于maximumPoolSize则执行拒绝策略。pool.execute(t6);pool.shutdown();} }
http://www.lebaoying.cn/news/56325.html

相关文章:

  • 网站建设济宁网站专题设计稿
  • 做职业背景调查的网站药品网站前置审批
  • 苏州品牌网站设计开发牡丹江网站建设公司
  • 服务器搭建网站山东兽药网站建设
  • flash 的网站新型实体企业100强
  • 学校网站建设合同单纯做seo能否提升网站流量
  • 哪些网站可以免费推广网页设计尺寸高度
  • 丰台路网站建设怎么做像表白墙的网站
  • 专业找工作网站下载怎么卸载windows优化大师
  • 韩国网页游戏网站免费加速器看国外网站
  • 胶州为企业做网站的公司百度网盘怎么找片
  • o2o网站设计苏州网站建设报价单
  • 彩票网站怎么做赚钱网络服务提供者不得为未满多少岁开展工作
  • 泉州网站建设泉州做网站 上海
  • 网站开发主要框架 后端直播小程序源码
  • 网站建设需求列表线上推广渠道和方式
  • 网络公司除了建网站装潢设计专业主要学什么
  • 织梦做旅游网站柳市网站建设公司
  • 外冈网站建设商城网站设计配色思想
  • 做有声小说网站财务公司网站建设
  • 永州网站推广凡客诚品为什么没落了
  • 网站首页排版设计用vs2010做的网站的源码
  • 网站规划与网站建设以下不属于专用网页制作工具的是
  • 什么网站可以做实验室支持ipv6网站开发
  • 广州网站建设一般多少钱织梦调用网站备案号
  • 国家商标查询入口深圳网站seo服务
  • 可信网站的认证邯郸单位网站建设
  • 公司网页制作具体做什么seo顾问收费
  • 做外贸网站公司wordpress幻灯片插件怎么用
  • 中小企业网站建设应该注意什么事项怎么建设网站服务器