阅读完本篇文章会知道如下三点:

1.进程-线程简单介绍

2.java的线程池是什么,有哪些类型,作用分别是什么

3.使用线程池的优点

1.进程-线程的简单介绍

进程

什么是进程呢?

进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的调度的基本单位,是操作系统结构的基础。简单来讲:进程是指运行中的应用程序,进程是一个实体,每一个进程都有它自己的地址空间。例如我们点击了QQ,就启动了一个进程,操作系统就会为这个进程分配独立的地址空间,当我们又点击浏览器,这样又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。

线程

什么是线程呢?

线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少有一个线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。注意:线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源,线程有就绪,阻塞,运行三种基本状态。

另外:在Unix System和SunOS中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。

2.java的线程池是什么,有哪些类型,作用分别是什么

线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果某个线程在托管代码中空闲,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后辅助线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才能启动。

java里面的线程池的顶级接口是Executor,Executor并不是一个线程池,而只是一个执行线程的工具,而真正的线程池是ExecutorService

java中的有哪些线程池?

1.newCachedThreadPool创建一个可缓存线程池程

2.newFixedThreadPool 创建一个定长线程池

3.newScheduledThreadPool 创建一个周期性执行任务的线程池

4.newSingleThreadExecutor 创建一个单线程化的线程池

下面一一分析:

1.newCachedThreadPool,是一种线程数量不定的线程池,并且其最大线程数为Integer.MAX_VALUE,这个数是很大的,一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任务,当整个线程池都处于闲置状态时,线程池中的线程都会超时被停止。

实例代码:

public class PoolExecutorTest {public static void main(String[] args) {// TODO Auto-generated method stubExecutorService mCachelThreadPool = Executors.newCachedThreadPool();for(int i = 0;i < 7;i++ ) {final int index = i;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}mCachelThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("第" +index +"个线程" +Thread.currentThread().getName()); }});}}}

输出结果:

从结果可以看到,执行第二个任务的时候第一个任务已经完成,会复用执行第一个任务的线程,不用每次新建线程。

2.newFixedThreadPool 创建一个指定工作线程数量的线程池,每当提交一个任务就创建一个工作线程,当线程 处于空闲状态时,它们并不会被回收,除非线程池被关闭了,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列(没有大小限制)中。由于newFixedThreadPool只有核心线程并且这些核心线程不会被回收,这样它更加快速底相应外界的请求。

实例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置最大线程数5个ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(5);for(int i = 0;i < 7;i++ ) {final int index = i;mFixedThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("时间是:"+System.currentTimeMillis()+"第" +index +"个线程" +Thread.currentThread().getName()); try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}    }});}}}

输出结果:

由于设置最大线程是5,所以当执行完这5个线程后,等待两秒后,在执行后面2个线程。

3.newScheduledThreadPool 创建一个线程池,它的核心线程数量是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收,它可安排给定延迟后运行命令或者定期地执行。这类线程池主要用于执行定时任务和具有固定周期的重复任务。

延迟执行实例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置池中核心数量是2ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  System.out.println("现在的时间:"+System.currentTimeMillis());mScheduledThreadPool.schedule(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("现在的时间:"+System.currentTimeMillis());}}, 4, TimeUnit.SECONDS);//这里设置延迟4秒执行}}

执行的结果如下:

误差可以忽略,实际结果确实延迟了4秒执行。

定期执行示例代码

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置池中核心数量是2ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  System.out.println("现在的时间:"+System.currentTimeMillis());mScheduledThreadPool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("现在的时间:"+System.currentTimeMillis());}}, 2, 3,TimeUnit.SECONDS);//这里设置延迟2秒后每3秒执行一次}}

执行的结果如下:

可发现确实延迟2秒后每隔3秒后就会执行一次,程序不退出就一直执行下去。

4.newSingleThreadExecutor这类线程池内部只有一个核心线程,以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

示例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubExecutorService mSingleThreadPool = Executors.newSingleThreadExecutor();     for(int i = 0;i < 7;i++) {final int number = i;mSingleThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("现在的时间:"+System.currentTimeMillis()+"第"+number+"个线程");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}});}}}

执行的结果如下:

可发现是有顺序地去执行上面6个线程。

3.使用线程池的优点

1.重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销

2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞

3.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能

关注微信公众号,一面技术一面艺术

java中的线程池有哪些,分别有什么作用?相关推荐

  1. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  2. 万字图文 | 学会Java中的线程池,这一篇也许就够了!

    来源:一枝花算不算浪漫 线程池原理思维导图.png 前言 Java中的线程池已经不是什么神秘的技术了,相信在看的读者在项目中也都有使用过.关于线程池的文章也是数不胜数,我们站在巨人的肩膀上来再次梳理一 ...

  3. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

  4. 【多线程和并发】Java中的线程池的实现原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池. 合理使用线程池能带来三个好处: 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗: 提 ...

  5. 多线程线程池的实现java_如何在Java中实现线程池

    多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...

  6. 如何在Java中实现线程池

    线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或多个线程.在多线程中,每个任 ...

  7. 深入理解java中的线程池

    线程池中各个参数的含义 corePoolSize: 核心池的大小,这个参数跟线程池的实现原理有非常大的关系.**在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行 ...

  8. Java中的线程池如何实现,一文彻底搞懂

    前言 为什么要用线程池一键获取线程相关资料,还可获取最新java面试真题库 在 HotSpot VM 的线程模型中,Java 线程被一对一映射为内核线程. Java 在使用线程执行程序时,需要调用操作 ...

  9. 如何在JAVA中创建线程池

    ExecutorService 今天小编要分享的是关于线程池, 想必接触到并发处理的朋友都有用到线程池, 当我们访问服务器的量达到服务器一定量的时候, 比如几百万几千万,很容易造成服务器崩掉, 如果使 ...

最新文章

  1. I.MX6 Android 5.1 回到 Android 4.2 emmc 启动
  2. hdu 5563 Clarke and five-pointed star (枚举)
  3. 每个前端开发者必会的二十个JavaScript面试题
  4. 汇编烧程序进单片机要什么软件_单片机编程语言及应用技巧解析
  5. 如何设计实现一个地址反解析服务?
  6. java散列法的运用实例,Java HashMap compute() 使用方法及示例
  7. 收获,不止SQL优化——抓住SQL的本质--第三章
  8. 用 GDI 操作 EMF 文件(转)
  9. npm、cnpm、yarn的安装与常用命令
  10. tplink查看上网记录_TPLINK路由器控制面板查看运行状态详解
  11. 博客思听-中文有声书摘更新地址
  12. HP服务器虚拟IP,HP Jetdirect 打印服务器 - 用于 TCP/IP(UDP)连接的 HP Jetdirect 端口号...
  13. Android 8.0 手机亮灭屏
  14. 基于Android车载系统模块资料
  15. 扇贝python课程打卡_Learning by doing——百日“扇贝打卡” 历程展望
  16. Windows 7使用宝典安装技巧篇之——如何在Win7桌面上显示“我的电脑”
  17. Restful-API设计最佳实战--Django播客系统(五)
  18. 【期末复习】计算机网络 物理层
  19. 关键词排名点击软件优化所必须考虑的几点内容!
  20. 别用 VMware 了,这款虚拟机简单、轻量、好用还免费...

热门文章

  1. 红绿灯故障报警电路(电工实验)
  2. 【转载】linux top命令及参数详解
  3. yolov5昆虫识别模型测试
  4. uniapp接入支付宝支付详细申请流程2021.6.1
  5. Linux - gzip使用
  6. 网页尾部footer编写--小技巧
  7. jquery+ajax+ashx。ashx的使用方法
  8. 安全运营中心(SOC)从这里开始(一)
  9. 5V升压充电8.4V芯片
  10. Android网络开发技术实战详解