【JavaSE】【多线程】线程池

【JavaSE】【多线程】线程池

目录

一、线程池

线程池:线程池可以简单理解为存放多个线程的一段空间。

线程池的作用:就是把线程提前创建好,放入线程池中,需要线程时从线程池中取,线程用完归还到线程池中。这样就可以减少线程创建的开销。

一个操作系统包含内核和以及其它计算机系统所必须的组件,
而内核中包含了操作系统的各种核心功能:管理硬件设备,给软件提供稳定的运行环境。
而在计算机中认为有一段代码在应用程序中完成,执行过程是可控的,而在内核中完成的过程是不可控的。而可控的操作比不可控更加高效。

直接创建线程比从线程池拿线程开销小的原因:

  • 直接创建线程,需要内核配合完成,是不可控的;
  • 先创建好在从线程池中去取,取线程就是可控的操作。

Java标准库中提供的类ThreadPoolExecutor就是创建线程池的类。

二、ThreadPoolExecutor类讲解

2.1 构造方法

在ThreadPoolExecutor类中主要提供了下面四种不同参数的构造方法。
我们讲解第四种7种参数版本中每个参数代表什么。

2.1.1 corePoolSize和maximumPoolSize

int corePoolSize代表核心线程数的个数。核心线程随着线程池的创建而创建,销毁而销毁。
int maximumPoolSize代表最大线程数。就是核心线程数与非核心线程数之和。非核心线程是自适应创建的,不繁忙的时候就销毁,繁忙的时候在创建。

2.1.2 KeepAliveTime和unit

long KeepAliveTime代表非核心线程允许空闲的最大时间。
TimeUnit unit代表时间单位。
TimeUnit是一个枚举类。

2.1.3 workeQueue

blockingQueue<Runnable> workQueue代表工作队列,也是一个阻塞队列。线程池本身就是一个生产者消费者模型,调用submit方法就是在生产,线程池中的线程就是消费者。

2.1.4 threadFactory

ThreadFactory threadFactory给线程Thread类提供的工厂类。
ThreadFactory是一个接口。

并不能直接出来一个对象,需要我们自己创建类实现该接口。
也可以使用Java中自带的默认的方式Executors类下的defaultThreadFactory方法:Executors.defaultThreadFactory();

工厂模式:工厂模式就是主要用来弥补构造方法的缺陷的一种设计模式。当构造方法因为重载限制时,可以当前类中使用static静态方法(这个静态方法也称为工厂方法)或者单独使用一个类提供静态方法(这个类称为工厂类),在静态方法中调用构造方法。

例子:我们表示一个点的坐标有使用(x,y)坐标系的方法和(ρ,θ)来表示。
像下面这样提供构造方法就会报错。

但是我们像下面这样提供一个工厂类就可以避免了。

classPoint{double x;double y;double ρ;double θ;}classPointFactory{publicstaticvoidPointXY(double x,double y){Point point =newPoint(); point.x = x; point.y = y;}publicstaticvoidPointρθ(double ρ,double θ){Point point =newPoint(); point.ρ = ρ; point.θ = θ;}}

2.1.5 handler

RejectedExectionHandler handler表示 拒绝策略。


在调用submit,将任务给到任务队列,而在线程池中不会像阻塞队列一样,队列满了就阻塞,而是提供了4中拒绝策略。

  • AbortPolicy:线程池中直接抛出异常,撂挑子不干了。
  • CallerRunsPolicy:让调用submit方法的线程自己执行这个任务。
  • DiscardOldestPolicy:丢弃线程池中最老的任务,给新任务腾出空间。
  • DiscardPolicy:丢弃线程池中最新的任务,即submit的任务。

三、简易构造线程池

在Java中提供了Exectors类对ThreadPoolExecutor类进行了进一步封装,可以使用这个类来创建一个默认的线程池。

四、自己实现一个简单线程池

我们创建一个固定容量的线程池,只实现其中的submit方法和构造方法。

  • 构造一个阻塞队列;
  • 在构造方法中传要创建的线程数,循环创建线程,在线程中循环拿出队列中的任务,并执行run方法,不要忘记start线程。
  • 在submit方法中只要将任务put到队列中即可。
publicclassMyThreadPoolExecutor{//BlockingDeque<Runnable> queue =newLinkedBlockingDeque<>(1000);publicMyThreadPoolExecutor(int n ){//创建n个线程for(int i =0; i < n; i++){Thread thread =newThread(()->{try{while(true){Runnable task = queue.take(); task.run();}}catch(InterruptedException e){ e.printStackTrace();}}); thread.start();}}publicvoidsubmit(Runnable task)throwsInterruptedException{ queue.put(task);}}

Read more

Java调用百度地图天气查询服务获取当前和未来天气-以贵州省榕江县为例

Java调用百度地图天气查询服务获取当前和未来天气-以贵州省榕江县为例

目录 前言 一、百度天气查询服务 1、天气查询服务 2、查询API简介 二、UniHttp集成天气查询服务 1、定义访问接口 2、业务集成调用 三、天气检索成果 1、IDE检索结果输出 2、互联网天气对比 四、总结 前言         天气与人们的生活息息相关,无论是日常出行、农业生产、交通调度还是旅游规划等,都离不开准确及时的天气信息。对于贵州省榕江县这样的地区,了解天气情况显得尤为重要。榕江县位于贵州省东南部,属于亚热带湿润季风气候,四季分明,气候多样,准确的天气查询服务能够帮助当地居民和外来人员更好地安排生产生活。最近榕江县接连遭受水灾,对老百姓的生产生产造成了很大的损失。         百度地图的天气查询服务具有一些明显的优势。首先,数据来源可靠,百度与专业的气象数据机构合作,能够提供准确、实时的天气信息 。其次,查询方式多样,支持通过城市名称、城市代码、经纬度等多种方式进行查询,方便用户获取所需地区的天气数据。此外,

By Ne0inhk
Docker+K8s 部署微服务:从搭建到运维的全流程指南(Java 老鸟实战版)

Docker+K8s 部署微服务:从搭建到运维的全流程指南(Java 老鸟实战版)

Docker+K8s 部署微服务:从搭建到运维的全流程指南(Java 老鸟实战版) 作为一名摸爬滚打八年的 Java 开发,从最初的单体应用 WAR 包扔 Tomcat,到后来的微服务集群部署,踩过的坑能绕公司机房三圈。其中最让人头疼的就是「环境一致性」和「运维复杂度」—— 开发环境跑的飞起,测试环境各种报错,生产环境突然雪崩,排查半天发现是配置不一致、端口冲突、依赖缺失… 直到 Docker+K8s 组合横空出世,才算彻底解决了这些痛点。这篇文章就从 Java 开发的视角,带大家走一遍「微服务容器化 + K8s 编排」的全流程,从环境搭建到生产运维,每一步都附实战代码和避坑指南,保证看完就能落地。 一、为什么选择 Docker+K8s?(八年经验的选型逻辑) 在聊技术细节前,先说说我为什么推荐这个组合。作为 Java

By Ne0inhk
Java外功精要(5)——Spring AOP

Java外功精要(5)——Spring AOP

1.概述 面向切面编程(Aspect Orient Programming,AOP):是一种编程范式,旨在将 横切关注点(Cross-Cutting Concerns,如日志、事务、安全等) 从业务逻辑中分离出来,通过模块化的方式增强代码的可维护性和复用性。核心思想是通过“切面”定义通用功能,并在运行时动态织入到目标代码中横切关注点(Cross-Cutting Concerns):指的是在系统中"横向"跨越多个模块、多个层次的功能需求,它们无法很好地被封装在单个类或模块中 1.1 场景举例:监控业务性能 1.1.1 硬编码实现 @Slf4jpublicclassHardCoding{publicvoiddemo(){long startTime =System.currentTimeMillis();//业务代码 log.info("消耗时间:{}"

By Ne0inhk
Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结

Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结

🏠个人主页:黎雁 🎬作者简介:C/C++/JAVA后端开发学习者 ❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生 ✨ 从来绝巘须孤往,万里同尘即玉京 文章目录 * Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结 🕒 * 📝 文章摘要 * 一、时间相关基础知识点 ⏱ * 1. 时间标准 * 2. 时间单位与换算 * 二、Date 时间类 📅 * 1. 概述 * 2. 构造方法 * 3. 成员方法 * 4. 代码示例 * 三、SimpleDateFormat 格式化与解析 ✍️ * 1. 作用

By Ne0inhk