完全解析Android多线程中线程池ThreadPool的原理和使用

作者:Carson_Ho 时间:2022-04-07 20:19:40 

前言对于多线程,大家应该很熟悉。但是,大家了解线程池吗?今天,我将带大家全部学习关于线程池的所有知识。

目录

完全解析Android多线程中线程池ThreadPool的原理和使用

1. 简介

完全解析Android多线程中线程池ThreadPool的原理和使用

2. 工作原理

2.1 核心参数线程池中有6个核心参数,具体如下

完全解析Android多线程中线程池ThreadPool的原理和使用

上述6个参数的配置 决定了 线程池的功能,具体设置时机 = 创建 线程池类对象时 传入

ThreadPoolExecutor类 = 线程池的真正实现类
开发者可根据不同需求 配置核心参数,从而实现自定义线程池

// 创建线程池对象如下// 通过 构造方法 配置核心参数  Executor executor = new ThreadPoolExecutor(                        CORE_POOL_SIZE,                       MAXIMUM_POOL_SIZE,                       KEEP_ALIVE,                       TimeUnit.SECONDS,                        sPoolWorkQueue,                       sThreadFactory                         );// 构造函数源码分析  public ThreadPoolExecutor (int corePoolSize,                int maximumPoolSize,                long keepAliveTime,                TimeUnit unit,                BlockingQueue<Runnable workQueue>,                ThreadFactory threadFactory )

注:Java 里已内置4种常用的线程池(即 已经配置好核心参数),下面会详细说明

2.2 内部原理逻辑

当线程池运行时,遵循以下工作逻辑

完全解析Android多线程中线程池ThreadPool的原理和使用

3. 使用流程

线程池的使用流程如下

// 1. 创建线程池  // 创建时,通过配置线程池的参数,从而实现自己所需的线程池  Executor threadPool = new ThreadPoolExecutor(                       CORE_POOL_SIZE,                       MAXIMUM_POOL_SIZE,                       KEEP_ALIVE,                       TimeUnit.SECONDS,                       sPoolWorkQueue,                       sThreadFactory                       );  // 注:在Java中,已内置4种常见线程池,下面会详细说明// 2. 向线程池提交任务:execute()  // 说明:传入 Runnable对象    threadPool.execute(new Runnable() {      @Override      public void run() {        ... // 线程执行任务      }    });// 3. 关闭线程池shutdown()  threadPool.shutdown(); // 关闭线程的原理 // a. 遍历线程池中的所有工作线程 // b. 逐个调用线程的interrupt()中断线程(注:无法响应中断的任务可能永远无法终止) // 也可调用shutdownNow()关闭线程:threadPool.shutdownNow() // 二者区别: // shutdown:设置 线程池的状态 为 SHUTDOWN,然后中断所有没有正在执行任务的线程 // shutdownNow:设置 线程池的状态 为 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表 // 使用建议:一般调用shutdown()关闭线程池;若任务不一定要执行完,则调用shutdownNow()

4. 常见的4类功能线程池

根据参数的不同配置,Java中最常见的线程池有4类:

定长线程池(FixedThreadPool)定时线程池(ScheduledThreadPool )可缓存线程池(CachedThreadPool)单线程化线程池(SingleThreadExecutor)

即 对于上述4类线程池,Java已根据 应用场景 配置好核心参数

4.1 定长线程池(FixedThreadPool)特点:只有核心线程 & 不会被回收、线程数量固定、任务队列无大小限制(超出的线程任务会在队列中等待)应用场景:控制线程最大并发数具体使用:通过 Executors.newFixedThreadPool() 创建示例:

// 1. 创建定长线程池对象 & 设置线程池线程数量固定为3ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);// 2. 创建好Runnable类线程对象 & 需执行的任务Runnable task =new Runnable(){ public void run(){  System.out.println("执行任务啦");   }  };// 3. 向线程池提交任务:execute()fixedThreadPool.execute(task);// 4. 关闭线程池fixedThreadPool.shutdown();

4.2 定时线程池(ScheduledThreadPool )特点:核心线程数量固定、非核心线程数量无限制(闲置时马上回收)应用场景:执行定时 / 周期性 任务使用:通过Executors.newScheduledThreadPool()创建示例:

// 1. 创建 定时线程池对象 & 设置线程池线程数量固定为5ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);// 2. 创建好Runnable类线程对象 & 需执行的任务Runnable task =new Runnable(){    public void run(){       System.out.println("执行任务啦");     }  };// 3. 向线程池提交任务:schedule()scheduledThreadPool.schedule(task, 1, TimeUnit.SECONDS); // 延迟1s后执行任务scheduledThreadPool.scheduleAtFixedRate(task,10,1000,TimeUnit.MILLISECONDS);// 延迟10ms后、每隔1000ms执行任务// 4. 关闭线程池scheduledThreadPool.shutdown();

4.3 可缓存线程池(CachedThreadPool)特点:只有非核心线程、线程数量不固定(可无限大)、灵活回收空闲线程(具备超时机制,全部回收时几乎不占系统资源)、新建线程(无线程可用时)

任何线程任务到来都会立刻执行,不需要等待

应用场景:执行大量、耗时少的线程任务 使用:通过Executors.newCachedThreadPool()创建 示例:

// 1. 创建可缓存线程池对象ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 2. 创建好Runnable类线程对象 & 需执行的任务Runnable task =new Runnable(){ public void run(){    System.out.println("执行任务啦");      }  };// 3. 向线程池提交任务:execute()cachedThreadPool.execute(task);// 4. 关闭线程池cachedThreadPool.shutdown();//当执行第二个任务时第一个任务已经完成//那么会复用执行第一个任务的线程,而不用每次新建线程。

4.4 单线程化线程池(SingleThreadExecutor)

特点:只有一个核心线程(保证所有任务按照指定顺序在一个线程中执行,不需要处理线程同步的问题)

应用场景:不适合并发但可能引起IO阻塞性及影响UI线程响应的操作,如数据库操作,文件操作等

使用:通过Executors.newSingleThreadExecutor()创建示例:

// 1. 创建单线程化线程池ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 2. 创建好Runnable类线程对象 & 需执行的任务Runnable task =new Runnable(){ public void run(){    System.out.println("执行任务啦");      }  };// 3. 向线程池提交任务:execute()singleThreadExecutor.execute(task);// 4. 关闭线程池singleThreadExecutor.shutdown();

4.5 常见线程池 总结 & 对比

完全解析Android多线程中线程池ThreadPool的原理和使用

5. 总结阅读本文后,相信你已经非常了解线程池 & 用法接下来,我会继续讲解Android开发中关于多线程的知识,具体包括Thread类、Handler、HandlerThread等等,有兴趣可以继续关注Carson_Ho的安卓开发笔记请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

来源:https://blog.csdn.net/carson_ho/article/details/80060201

标签:Android,ThreadPool
0
投稿

猜你喜欢

  • 10个C#程序员经常用到的实用代码片段

    2022-12-01 13:02:58
  • Java8通过Function获取字段名的步骤

    2022-07-14 14:06:23
  • Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动

    2023-09-21 00:16:18
  • winfrom 在业务层实现事务控制的小例子

    2021-11-16 14:19:50
  • java 如何远程控制tomcat启动关机

    2023-04-10 03:21:47
  • Java实现简单文件过滤器功能

    2021-09-13 23:27:58
  • Mybatis与Ibatis的区别

    2022-11-19 14:27:42
  • 浅谈在springboot中使用定时任务的方式

    2023-03-02 19:14:09
  • Android Google AutoService框架使用详解

    2023-07-19 22:48:14
  • 浅析Spring工厂的反射和配置文件

    2023-06-22 20:52:23
  • Java实现矩阵加减乘除及转制等运算功能示例

    2023-07-05 04:49:53
  • Spring Boot Admin实践详解

    2023-08-25 06:57:53
  • Unity解析gif动态图操作

    2022-05-27 08:16:43
  • 三分钟快速掌握Java中枚举(enum)

    2023-11-27 09:46:30
  • C#中的try catch finally用法分析

    2021-06-20 18:31:28
  • 浅谈Java继承中的转型及其内存分配

    2023-11-03 22:56:04
  • 简单通用JDBC辅助类封装(实例)

    2021-10-14 23:09:28
  • SpringBoot整合RabbitMQ实现六种工作模式的示例

    2021-10-17 06:21:08
  • Java实现两人五子棋游戏(三) 画出棋子

    2021-05-29 04:53:53
  • Java使用CountDownLatch实现网络同步请求的示例代码

    2022-04-23 18:40:52
  • asp之家 软件编程 m.aspxhome.com