码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 线程安全案例 --- 线程池


    小王学习录

    • 今日鸡汤
    • 什么是线程池
    • 为什么需要线程池
      • 1. 协程
      • 2. 线程池
      • 3. 什么是用户态和内核态
    • 使用线程池 --- java标准库
      • 1. 线程池的创建
      • 2. 工厂模式
      • 3. 线程池的使用
    • ThreadPollExecutor类
      • 构造方法
        • 1. corePoolSize, maximumPoolSize 线程
        • 2. long keepAliveTime, TimeUnit unit 时间
        • 3. BlockingQueue workQueue 任务队列
        • 4. ThreadFactory threadfactory 创建线程
        • 5. RejectedExecutionHandler handler 拒绝策略
    • 实现线程池
    • 编外: Runnable介绍

    今日鸡汤

    爱人如养花, 最好的花匠是自己

    什么是线程池

    线程池是对线程进行管理和复用的机制. 在程序中创建一组线程, 当有任务需要执行时, 随机分配任务给空闲线程. 而不单独为一个任务创建线程, 这提高了线程的利用率, 减小了线程使用时创建和销毁的开销.
    线程池的管理结构, 线程对象状态, 线程队列保存在java虚拟机的堆中, 包括了ThreadPollExecutor中的字段. 而线程执行时的线程状态, 栈信息保存在内存中.

    为什么需要线程池

    即使引入了相对来说轻量的线程, 但是随着对并发要求以及系统性能要求的提高, 实现一种比线程更轻量的并发问题解决方式显得尤为重要, 如今出现的方法有两种:协程和线程池

    1. 协程

    协程(纤程): 在java标准库中暂时并没有支持协程. 当下热度较高的Go语言支持了协程, 这应该也是其发展至今的一条因素吧. 期待java大佬早日在标准库中实现协程.
    在这里插入图片描述

    2. 线程池

    第二种方法就是引进线程池. 创建和销毁线程的操作是由操作系统实现的, 有了线程池, 要用到线程时可以直接从池中拿, 也没必要销毁线程, 不用时放回到线程中. 从池中取和放的操作用户通过代码就能实现, 不用通过内核. 这种通过程序员写代码来操作线程叫用户态.

    3. 什么是用户态和内核态

    在这里需要说一下用户态和内核态的区别:

    1. 内核态: 内核态的操作是由操作系统内核来完成的, 操作系统提供给程序api, 称作为系统调用, 程序通过系统调用来驱使内核进行一些操作. 系统调用中的代码与内核相关, 开发程序员无法对其进行操作.
    2. 用户态: 程序执行是由程序员写代码来控制的, 执行什么, 怎么执行都是由程序员来指定.
    3. 内核态相比于用户态, 其操作更不可控. 因为内核并不只是为一个应用程序服务, 要对多个应用程序服务, 程序通过系统调用来驱使内核进行一些操作时, 并不知道此时内核要去完成多少个任务, 也不知道自己排在第几位去执行. 相比之下, 从池中拿的这种用户态执行时更加干净利索.

    使用线程池 — java标准库

    1. 线程池的创建

    java的标准库中是根据工厂模式来实现线程池的创建的, 看如下代码:

    ExecutorService executorService = Executors.newFixedThreadPool(10);
    //代码创建了一个线程池, 池里面有10个线程. 
    
    • 1
    • 2

    创建的线程池中的线程默认都为前台线程
    以上代码用一个类方法创建了一个对象, 构造对象被隐藏在了类方法中. 这种方法叫做工厂方法, 这个方法所属的类就是工厂类, 这样的代码使用了工厂模式. 下面对工厂模式进行简单介绍

    2. 工厂模式

    工厂模式也属于一种设计模式, 前面介绍过一种单例模式的设计模式, 今天来说一下工厂模式
    工厂模式: 通俗的讲, 工厂模式就是用一个普通方法来代替构造方法

    这种情况发生在方法重载不能用于完成当前功能. 比如:
    要表示一个点的坐标, 可以有平面直角坐标系和极坐标系两种表示方法, 两种表示方式的x,y坐标都是doble类型, 参数类型, 数量和返回类型都一致, 无法使用方法重载. 此时使用两个类方法(普通方法名可以不一致, 有几种构造方法就用几个不同名的类方法)来表示两种表示方法, 在类方法中再做一些限制从而实现用平面直角坐标系和极坐标系两种方式来表示坐标.

    3. 线程池的使用

    线程池的使用到的是submit方法, 使用submit可以异步的向线程池中的任务队列提交任务(不必等待任务执行完毕), 从而让线程池中的空闲线程去调用提交的任务.

    public class ThreadDome1 {
       
        public static void main(String[] args) {
       
            ExecutorService executorService = Executors.newFixedThreadPool(10);
    
            
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    CNN经典网络模型详解LeNet(LeNet-1, LeNet-4, LeNet-5最详细, Boosted LeNet-4)发展和过程
    Vue切换回页面可见状态后,避免执行多次滚动定位的动画
    [每周一更]-(第68期):Excel常用函数及常用操作
    ROS | 命名空间
    【案例】光电兼修的Alpha Cen,如何应对上升期的甜蜜烦恼?
    Java 一台机器搭建多个tomcat,运行不同的程序
    【MySQL系列】MySQL数据库基础
    读论文-NeRF学习笔记
    微信picker弹出之后 , 背景变成灰色是怎么做的
    如果在手机没有root的情况下完成安卓手机数据恢复
  • 原文地址:https://blog.csdn.net/qq_62414152/article/details/133845499
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号