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

靖边商务网站建设烟台网站建设 烟台网亿网络

靖边商务网站建设,烟台网站建设 烟台网亿网络,重庆彭水网站建设,泰安最新消息今天一、线程池概述 1、线程池的优势 线程池是一种线程使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与…

一、线程池概述

1、线程池的优势
  • 线程池是一种线程使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价,线程池不仅能够保证内核的充分利用,还能防止过分调度

  • 线程池的工作主要是控制运行的线程数量,在处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行

2、线程池的特点
  • 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的销耗

  • 提高响应速度: 当任务到达时,任务可以不需要等待线程创建就能立即执行

  • 提高线程的可管理性: 线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控


二、线程池的架构

  • Java 中的线程池是通过 Executor 框架实现的,该框架中用到了 Executor 接口,Executors 类,ExecutorService 类,ThreadPoolExecutor 类

三、线程池的种类与创建

1、一池 N 线程
(1)基本介绍
  • 线程池中的线程处于一定的量,可以很好的控制线程的并发量

  • 线程可以重复被使用,在显示关闭之前,都将一直存在

  • 超出一定量的线程被提交时候需在队列中等待

(2)创建方式
ExecutorService threadPool = Executors.newFixedThreadPool(5);
(3)适用场景
  • 适用于可以预测线程数量的业务,或者服务器负载较重,对线程数有严格限制的场景
(4)基本使用
  • 使用 5 个窗口处理 10 个顾客请求
ExecutorService threadPool = Executors.newFixedThreadPool(5);try {for (int i = 1; i <= 10; i++) {// 执行线程threadPool.execute(() -> {System.out.println(Thread.currentThread().getName()+" 办理业务");});}
} catch (Exception e) {e.printStackTrace();
} finally {// 关闭线程threadPool.shutdown();
}
  • 结果
pool-1-thread-1 办理业务
pool-1-thread-5 办理业务
pool-1-thread-4 办理业务
pool-1-thread-3 办理业务
pool-1-thread-2 办理业务
pool-1-thread-3 办理业务
pool-1-thread-4 办理业务
pool-1-thread-5 办理业务
pool-1-thread-1 办理业务
pool-1-thread-2 办理业务
2、一池一线程
(1)基本介绍
  • 线程池中最多执行一个线程,之后提交的线程活动将会排在队列中依次执行
(2)创建方式
ExecutorService threadPool = Executors.newSingleThreadExecutor();
(3)适用场景
  • 适用于需要保证顺序执行各个任务,并且在任意时间点,不会同时有多个线程的场景
(4)基本使用
  • 使用 1 个窗口处理 10 个顾客请求
ExecutorService threadPool = Executors.newSingleThreadExecutor();try {for (int i = 1; i <= 10; i++) {// 执行线程threadPool.execute(() -> {System.out.println(Thread.currentThread().getName()+" 办理业务");});}
} catch (Exception e) {e.printStackTrace();
} finally {// 关闭线程threadPool.shutdown();
}
  • 结果
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
3、一池可扩容线程
(1)基本介绍
  • 线程池中数量没有固定,可达到最大值为 Interger. MAX_VALUE

  • 线程池中的线程可进行缓存重复利用和回收,默认回收时间为一分钟

  • 当线程池中没有可用线程时,会重新创建一个线程

(2)创建方式
ExecutorService threadPool = Executors.newCachedThreadPool();
(3)适用场景
  • 适用于创建一个可无限扩大的线程池,服务器负载压力较轻,执行时间较短,任务多的场景
(4)基本使用
  • 处理 20 个顾客请求
ExecutorService threadPool = Executors.newCachedThreadPool();try {for (int i = 1; i <= 20; i++) {// 执行线程threadPool.execute(() -> {System.out.println(Thread.currentThread().getName()+" 办理业务");});}
} catch (Exception e) {e.printStackTrace();
} finally {// 关闭线程threadPool.shutdown();
}
  • 结果
pool-1-thread-1 办理业务
pool-1-thread-4 办理业务
pool-1-thread-3 办理业务
pool-1-thread-2 办理业务
pool-1-thread-6 办理业务
pool-1-thread-5 办理业务
pool-1-thread-8 办理业务
pool-1-thread-7 办理业务
pool-1-thread-3 办理业务
pool-1-thread-4 办理业务
pool-1-thread-7 办理业务
pool-1-thread-5 办理业务
pool-1-thread-1 办理业务
pool-1-thread-2 办理业务
pool-1-thread-6 办理业务
pool-1-thread-8 办理业务
pool-1-thread-3 办理业务
pool-1-thread-9 办理业务
pool-1-thread-7 办理业务
pool-1-thread-5 办理业务

四、线程池的底层原理

1、ThreadPoolExecutor 类
  • 通过查看上面三种方式创建线程池对象的源代码,发现都有 new ThreadPoolExecutor 操作,具体查看该类的源代码,其构造器涉及七个参数
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> 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;
}
2、ThreadPoolExecutor 构造器涉及的七个参数
  1. int corePoolSize:常驻线程数量

  2. int maximumPoolSize:最大线程数量

  3. long keepAliveTime:空闲线程存活时间

  4. TimeUnit unit:空闲线程存时间单位

  5. BlockingQueue workQueue:阻塞队列,存放提交但未执行任务

  6. ThreadFactory threadFactory:线程工厂,用于创建线程(可省略)

  7. RejectedExecutionHandler handler:阻塞队列满时的拒绝策略(可省略)


五、线程池的工作流程

  • 在创建了线程池后,线程池中的线程数为零

  • 当调用 execute 方法添加一个请求任务时,线程池会做如下判断

    1. 如果正在运行的线程数量小于 corePool 的线程数量,那么马上创建线程运行这个任务

    2. 如果正在运行的线程数量大于或等于 corePool 的线程数量,那么将这个任务存入阻塞队列

    3. 如果这个时候队列已满且正在运行的线程数量小于 maximumPool 的线程数量,则创建非核心线程立刻运行这个任务

    4. 如果队列已满且正在运行的线程数量大于或等于 maximumPool 的线程数量,那么线程池会启动拒绝策略

  • 当一个线程完成任务时,它会从队列中取下一个任务来执行

  • 当一个线程空闲超过一定的时间时,会做如下判断

    1. 如果当前运行的线程数大于 corePool 的线程数量,那么这个线程就被停掉

    2. 线程池的所有任务完成后,最终会收缩到 corePool 的大小


六、线程池的拒绝策略

1、 AbortPolicy
  • 默认的拒绝策略,会直接抛出 RejectedExecutionException 异常阻止系统正常运行
2、DiscardPolicy
  • 该策略会丢弃无法处理的任务,不给予任何处理也不抛出异常,如果允许任务丢失,这是最好的一种策略
3、DiscardOldestPolicy
  • 丢弃队列中等待最久的任务,然后把当前任务存入队列中,并尝试提交当前任务
4、CallerRunsPolicy
  • 该策略既不会丢弃任务,也不会抛出异常,而是将任务退回给调用者

七、自定义线程池

1、Executors 返回的线程池对象的弊端
  • FixedThreadPool 和 SingleThreadExecutor 允许请求队列的长度为 Interger.MAX_VALUE,可能会堆积大量异常, 从而导致 OOM

  • CachedThreadPool 允许的创建线程数量为 Interger.MAX_VALUE,可能会创建大量线程,从而导致 OOM

2、具体实现
package com.my.pool;import java.util.concurrent.*;public class MyThreadPoolTest {public static void main(String[] args) {ExecutorService threadPool = new ThreadPoolExecutor(2,5,2L,TimeUnit.SECONDS,new ArrayBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardOldestPolicy());// 处理 10 个顾客请求try {for (int i = 1; i <= 10; i++) {// 执行线程threadPool.execute(() -> {System.out.println(Thread.currentThread().getName()+" 办理业务");});}} catch (Exception e) {e.printStackTrace();} finally {// 关闭线程threadPool.shutdown();}}
}
  • 结果
pool-1-thread-1 办理业务
pool-1-thread-4 办理业务
pool-1-thread-3 办理业务
pool-1-thread-2 办理业务
pool-1-thread-3 办理业务
pool-1-thread-4 办理业务
pool-1-thread-1 办理业务
pool-1-thread-5 办理业务
http://www.dtcms.com/wzjs/833842.html

相关文章:

  • 网站基础模板网站建站时间查询
  • 电子商务网站设计心得北京网站设计制作费用
  • 网站内容营销西安巨久科技网站建设
  • 网页站点是什么意思网页制作设计框架
  • 上市公司网站推广方案阿里巴巴网站特色
  • 自己做网站如何销售软件开发项目预算表
  • 做漆包线的招聘网站青海省住房和城乡建设厅网站
  • 评价一个网站的优缺点网页设计 参考网站
  • 网站开发的软件支持建设银行个人网上银行登录入口
  • 营销型网站建设价格贵吗记账公司
  • 南京网站排名优化费用有哪些网络营销公司
  • 惠州仲恺住房和城乡建设局网站最近一周热点回顾
  • iis发布网站慢绍兴网络推广公司
  • 福永外贸网站建设公司外贸公司网页设计
  • 做网站时的注册权起到什么作用哪里网站建设公司好
  • 河西网站建设制作wordpress 子主题
  • 百度有没有做游戏下载网站吗淘宝运营的基础知识
  • 北京网站关键词优化推荐做一个谷歌网站多少钱
  • dw织梦做网站wordpress手机验证注册
  • 网络技术网站是做什么的制作灯笼作文
  • 网站建站服务公司地址微网站外链
  • 亚泰润德建设有限公司网站动态手机网站怎么做的
  • wordpress流量站网站维护包括哪些内容
  • 聊城市建设工程质量监督站网站无锡网站建设策划方案
  • 潍坊知名网站建设最新报价创建网站超市
  • 景观设计师如何做网站个人app
  • 网站开发开题报告怎么写网站分站的实现方法
  • 八宝山做网站的公司建设通网站是什么时间成立
  • 中建豪城建设有限公司网站烟台开发区网站建设
  • 广州外贸企业网站建设什么类型的网站好做