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

海外网站建站门户网站app

海外网站建站,门户网站app,广州网站建设腾虎,北京公司网站建设Java线程池知识点梳理 什么是线程池#xff1f; 线程在系统中创建的成本是相对比较高的#xff0c;所以使用”池化“的思想#xff0c;设计线程池#xff0c;有大量任务需要执行时#xff0c;可以直接从线程池中使用已经创建好的线程直接去执行。减少线程的创建和销毁带…Java线程池知识点梳理 什么是线程池 线程在系统中创建的成本是相对比较高的所以使用”池化“的思想设计线程池有大量任务需要执行时可以直接从线程池中使用已经创建好的线程直接去执行。减少线程的创建和销毁带来的开销线程池通过工作队列和线程管理来实现高效的任务执行。使用少量的线程数满足最大的吞吐量。 线程池的主要组成部分包括工作线程、任务队列、线程管理器等。线程池的设计有助于优化多线程程序的性能和资源利用同时简化了线程的管理和复用的复杂性。 线程池的实现 Java线程池的核心实现类是ThreadPoolExecutor主要类图如下 #mermaid-svg-AM4beUXg2TMPKwD2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AM4beUXg2TMPKwD2 .error-icon{fill:#552222;}#mermaid-svg-AM4beUXg2TMPKwD2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AM4beUXg2TMPKwD2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AM4beUXg2TMPKwD2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AM4beUXg2TMPKwD2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AM4beUXg2TMPKwD2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AM4beUXg2TMPKwD2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AM4beUXg2TMPKwD2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AM4beUXg2TMPKwD2 .marker.cross{stroke:#333333;}#mermaid-svg-AM4beUXg2TMPKwD2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AM4beUXg2TMPKwD2 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-AM4beUXg2TMPKwD2 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-AM4beUXg2TMPKwD2 .nodeLabel,#mermaid-svg-AM4beUXg2TMPKwD2 .edgeLabel{color:#131300;}#mermaid-svg-AM4beUXg2TMPKwD2 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-AM4beUXg2TMPKwD2 .label text{fill:#131300;}#mermaid-svg-AM4beUXg2TMPKwD2 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-AM4beUXg2TMPKwD2 .classTitle{font-weight:bolder;}#mermaid-svg-AM4beUXg2TMPKwD2 .node rect,#mermaid-svg-AM4beUXg2TMPKwD2 .node circle,#mermaid-svg-AM4beUXg2TMPKwD2 .node ellipse,#mermaid-svg-AM4beUXg2TMPKwD2 .node polygon,#mermaid-svg-AM4beUXg2TMPKwD2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AM4beUXg2TMPKwD2 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-AM4beUXg2TMPKwD2 g.clickable{cursor:pointer;}#mermaid-svg-AM4beUXg2TMPKwD2 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-AM4beUXg2TMPKwD2 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-AM4beUXg2TMPKwD2 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-AM4beUXg2TMPKwD2 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-AM4beUXg2TMPKwD2 .dashed-line{stroke-dasharray:3;}#mermaid-svg-AM4beUXg2TMPKwD2 #compositionStart,#mermaid-svg-AM4beUXg2TMPKwD2 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #compositionEnd,#mermaid-svg-AM4beUXg2TMPKwD2 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #dependencyStart,#mermaid-svg-AM4beUXg2TMPKwD2 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #dependencyStart,#mermaid-svg-AM4beUXg2TMPKwD2 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #extensionStart,#mermaid-svg-AM4beUXg2TMPKwD2 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #extensionEnd,#mermaid-svg-AM4beUXg2TMPKwD2 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #aggregationStart,#mermaid-svg-AM4beUXg2TMPKwD2 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 #aggregationEnd,#mermaid-svg-AM4beUXg2TMPKwD2 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-AM4beUXg2TMPKwD2 .edgeTerminals{font-size:11px;}#mermaid-svg-AM4beUXg2TMPKwD2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Executor execute(Runnable command) ExecutorService shutdown() isShutdown() : boolean isTerminated() : boolean submit(CallableT task) : FutureT ThreadPoolExecutor execute(Runnable command) AbstractExecutorService 线程池的状态 RUNNING 线程池一旦被创建就处于RUNNING状态任务数为0能够接收新任务对已排队的任务进行处理。SHUTDOWN不接收新任务但能处理已排队的任务。当调用线程池的shutdown()方法时线程池会由RUNNING转变为SHUTDOWN状态。STOP不接收新任务不处理已排队的任务并且会中断正在处理的任务。当调用线程池的shutdownNow()方法时线程池会由RUNNING或SHUTDOWN转变为STOP状态。TIDYING当线程池在SHUTDOWN状态下任务队列为空且执行中任务为空或者线程池在STOP状态下线程池中执行中任务为空时线程池会变为TIDYING状态会执行terminated()方法。这个方法在线程池中是空实现可以重写该方法进行相应的处理。TERMINATED线程池彻底终止。线程池在TIDYING状态执行完terminated()方法后就会由TIDYING转变为TERMINATED状态。 如何保存线程状态 ThreadPoolExecutor 源码中线程池的运行状态使用 ctl 高3位保存运行状态低29位保存有效的工作线程数 private final AtomicInteger ctl new AtomicInteger(ctlOf(RUNNING, 0));private static final int COUNT_BITS Integer.SIZE - 3;private static final int CAPACITY (1 COUNT_BITS) - 1;// runState is stored in the high-order bitsprivate static final int RUNNING -1 COUNT_BITS;private static final int SHUTDOWN 0 COUNT_BITS;private static final int STOP 1 COUNT_BITS;private static final int TIDYING 2 COUNT_BITS;private static final int TERMINATED 3 COUNT_BITS;// Packing and unpacking ctlprivate static int runStateOf(int c) { return c ~CAPACITY; }private static int workerCountOf(int c) { return c CAPACITY; }private static int ctlOf(int rs, int wc) { return rs | wc; }COUNT_BITS被定义为Integer.SIZE - 3即32位整数的29位每个线程池状态如RUNNING、SHUTDOWN等都是通过将一个整数左移COUNT_BITS位来定义的这样就把状态值放到了整数的最高3位。 例如 RUNNING状态的值为-1左移29位-1 的二进制表示为1111 1111 1111 1111 1111 1111 1111 1111共32个1。 -1 29 1110 0000 0000 0000 0000 0000 0000 0000其中高3位是111表示的就是线程池处于 RUNNING状态。 线程池核心参数 corePoolSize核心线程数空闲了也不会销毁除非设置了允许销毁核心线程allowCoreThreadTimeOut。maximumPoolSize线程池允许的最大线程数keepAliveTime当线程数大于核心线程数时多余空闲的线程在这个时间内还没有等到新任务就会被销毁unitkeepAliveTime的时间单位workQueue存放还未被线程执行的任务threadFactory线程工厂可以自定义设置线程池中线程的线程名称等handler拒绝策略但线程池无法执行新增的线程时是抛弃还是其他策略。 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueRunnable workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize 0 ||maximumPoolSize 0 ||maximumPoolSize corePoolSize ||keepAliveTime 0)throw new IllegalArgumentException();if (workQueue null || threadFactory null || handler null)throw new NullPointerException();this.acc System.getSecurityManager() null ?null :AccessController.getContext();this.corePoolSize corePoolSize;this.maximumPoolSize maximumPoolSize;this.workQueue workQueue;this.keepAliveTime unit.toNanos(keepAliveTime);this.threadFactory threadFactory;this.handler handler;}线程池执行任务流程 当工作线程数小于核心线程数时新任务来临会启动新线程执行任务。当工作线程数大于核心线程数且小于最大线程数时新任务会保存到队列当中等待线程执行。当队列满了且核心线程数小于最大线程数时新任务会创建新线程执行。当队列已满且工作线程数达到最大线程数时线程池会触发拒绝策略由RejectedExecutionHandler处理。先线程池中线程数超过核心线程数空闲时间超过keepAliveTime时空闲线程会被销毁。 线程池拒绝策略 RejectedExecutionHandler 接口的实现类有四种所以默认有四种拒绝策略 **AbortPolicy**直接抛出异常阻止系统正常运行。可以根据业务逻辑选择重试或者放弃提交等策略。 **CallerRunsPolicy **只要线程池未关闭该策略直接在调用者线程中运行当前被丢弃的任务。 不会造成任务丢失同时减缓提交任务的速度给执行任务缓冲时间。 **DiscardOldestPolicy **丢弃最老的一个请求也就是即将被执行的任务并尝试再次提交当前任务。 **DiscardPolicy **该策略默默地丢弃无法处理的任务不予任何处理。如果允许任务丢失这是最好的一种方案。 Executors提供的几种线程池 newSingleThreadExecutor()只有一个线程的线程池任务是顺序执行适用于一个一个任务执行的场景newCachedThreadPool()线程池里有很多线程需要同时执行60s内复用适用执行很多短期异步的小程序或者负载较轻的服务newFixedThreadPool()拥有固定线程数的线程池如果没有任务执行那么线程会一直等待适用执行长期的任务。newScheduledThreadPool()用来调度即将执行的任务的线程池newWorkStealingPool()底层采用forkjoin的Deque采用独立的任务队列可以减少竞争同时加快任务处理 参数FixedThreadPoolCachedThreadPoolScheduledThreadPoolSingleThreadExecutorSingleScheduledThreadPoolcorePoolSize构造函数传入0构造函数传入11maxPoolSize同corePoolSizeInteger.MAX_VALUEInteger.MAX_VALUE1Integer.MAX_VALUEkeepAliveTime060s000 建议开发规范 阿里Java开发手册中提到【强制】线程池不允许使用 Executors 去创建而是通过 ThreadPoolExecutor 的方式这样的处理方 式让写的同学更加明确线程池的运行规则规避资源耗尽的风险。 Executors 返回的线程池对象的弊端如下 FixedThreadPool 和 SingleThreadPool允许的请求队列长度为 Integer.MAX_VALUE可能会堆积大量的请求从而导致 OOM。 CachedThreadPool允许的创建线程数量为 Integer.MAX_VALUE可能会创建大量的线程从而导致 OOM。 ScheduledThreadPool允许的请求队列长度为 Integer.MAX_VALUE可能会堆积大量的请求从而导致 OOM。 根据业务独立配置线程池将较慢服务与主线程池隔离开。 创建线程池使用线程工厂指定形成名称方便出错时排查。 线程资源必须由线程池提供不允许自行在程序中显示创建线程。
http://www.hkea.cn/news/14400335/

相关文章:

  • 辽宁品牌建设促进会 网站小企业网站价格
  • 陕西省交通建设集团商界分公司网站对外宣传及网站建设文件稿
  • 网站制作公司有哪些移植wordpress数据库
  • 网站建设教程纯正苏州久远网络哪网站建设
  • 外贸建站优化做报名网站
  • 网站设计是什么网站建设战略伙伴
  • 公司网站开发费用放在什么科目如何免费注册网站平台
  • 成都专业网站建设哪家好网站描述怎么写利于seo
  • 重庆制作网站速成班网站设计主色学校
  • 成都网站开发的公司多个wordpress站点互相
  • 长沙网站建设公司有哪些个人婚礼网站设计
  • 汉中网站网站建设大丰网站建设价格
  • 功能介绍的网站网站制作公司大型
  • dedecms可以做什么网站番禺人才网单位招考
  • 百度认证考试许昌seo推广
  • 做网站大公司哪个网站可以做销售记录
  • 寺庙网站建设足球最新比赛消息
  • 新闻发布的网站静态网站开发用到的技术
  • 快手刷赞网站推广软件敬请期待英文翻译
  • 想在意大利做购物网站仿36氪wordpress
  • 做一个高端网站多少钱品质好货
  • 饮料网站模板莞城网页设计
  • 深圳产品推广网站建设方案做网站需要营业执照嘛
  • 虚拟主机 删除网站缓存建立网站费用怎么做会计分录
  • vs2010c 做网站郑州网站开发设计公司电话
  • 成都市锦江区网站建设免费旅行社网站模板
  • 企业网站哪个好石家庄网站开发设计
  • 弹幕网站怎么做网络营销创意方案
  • 石家庄学做网站建设培训班在线网站生成器
  • 网站哪个公司做网络域名也可以用中文名称来命名