多线程、线程同步及其相关类、死锁、线程池

2023-11-15

多线程
    线程创建
        1、自定义类继承Thread,重写run
            Thread t=new 自定义类();
            t.start();//jvm会调用t的run方法,同时当前线程会返回调用处,继续往下执行
        2、实现Runnable ,实现run()
            Thread t=new Thread(new MyRunnable());
            t.start();
        区别:
            1、特点:单继承的局限,简单
            2、特点:多实现,侵入性低,可以实现资源共享
    
    线程的状态
    线程的调度
        如何分配CPU时间片---机制
        1、优先级 :一个线程抢占到CPU的概率
            可以设置1-10之间的整数,1最低,10最高,5默认值
        2、线程休眠
            static void sleep(long millis) 
            所在线程会处于休眠,休眠时间millis毫秒
            可能引发InterruptedException中断异常
            使用场景:主要是来模拟线程的任务消耗的时间,强制程序减慢速度
        3、join插队
             void join()  插队,一直执行完
             void join(long millis)  插队一定的时间
             谁调用,谁插队。
             可能引发InterruptedException中断异常
        4、yield礼让
            static void yield() 所在线程礼让
            放弃本次抢占到的CPU,重新再来抢。可能礼让成功,也可能礼让不成功
         案例:
             模拟医院叫号
             50个普通号   
             10个专家号   
             专家号 时间是普通号的2倍
             专家号 的优先级高
             当普通号看到10号的时候,把所有的所有的专家号看完再看普通号
            
            主线程--普通号
            子线程--专家号
    
    线程同步
        火车站买票
        多个窗口卖票
        票数量ticket
        多个窗口用多个线程来模拟
        任务---run()
        
        多线程资源共享可能会出现以下问题:
         *     1、同一张票由多个窗口卖
         *  2、有些票没有1个窗口在卖
         原因:读写不一致。
               某个线程读的数据不是自己曾经写的。自己写的可能被别人读取了。
          解决方案:
            同步代码块
             Synchronized(对象锁){
                    代码块
           }
           
               拥有锁,才能执行代码块。代码块执行完,就会释放锁。别的线程就可以继续获取锁
            对象锁:每一个对象都有一把锁
          
        同步方法
             synchronized void sell(){}
            默认使用的是this这把锁
             
         区别:
            1、同步方法可以重用,同步代码块比较灵活
            2、当一个线程在访问同步方法时,其它的线程无法访问所有的同步方法
            3、同步代码块可以嵌套定义
            
        同步的特点:好处:实现资源共享的读写一致
             缺点:效率低
        
        同步相关类:线程安全-(多线程下访问数据是一致的)
             * StringBuilder 不是线程安全,效率高,适合用在单线程
             * StringBuffer  线程安全,效率低,适合用在多线程
             
             * ArrayList不是线程安全,效率高,适合用在单线程
             * Vector  线程安全
            
             * Hashtable 线程安全
             * HashMap 不是线程安全
        
        死锁
            对方彼此拥有着对方想要的锁,还在等待对方释放人家的锁
            
            小明 拥有小汽车  
            小花 拥有洋娃娃
            小明:你把你的洋娃娃给我,我就把我的小汽车给你
            小花:你把你的小汽车给我,我就把我的洋娃娃给你
            
            程序:卡死
            原因:同步嵌套
                同步嵌套会引发死锁,但不是一定会死锁。
                编程中尽量避免同步嵌套。
            A-->B B--->C C-->A
    
        生产者和消费者的问题
            先生产再消费,消费则生产,生产完就消费
            生产--消费--生产--消费
            Object 
                wait()当前线程等待
                notify() 唤醒等待单个线程
                notifyAll();唤醒等待的所有线程。
        
    
    
    
线程池
    1、线程池存储一些线程对象,减少线程的创建和销毁,让程序员更专业任务。
    2、定时、定期的启动线程
    
    线程池怎么用?
        java.util.concurrent 
    Executor 
        执行已提交的 Runnable 任务的对象
        子接口ExecutorService :管理终止的方法
                类ThreadPoolExecutor
            ScheduledExecutorService:安排在给定的延迟后运行或定期执行的命令
                ScheduledThreadPoolExecutor
    Executors
        newFixedThreadPool(int nThreads) 创建固定数量的线程池
        newSingleThreadExecutor()创建单线程池
        newCachedThreadPool()创建可缓存的线程池
        newScheduledThreadPool(int corePoolSize)创建可定期执行的线程池对象
        
    可自定义配置线程池对象
    ThreadPoolExecutor
      int corePoolSize,核心线程数
      int maximumPoolSize,最大线程数
      long keepAliveTime,最大活跃时间
      TimeUnit unit,最大活跃时间的单位
      BlockingQueue<Runnable> workQueue,阻塞队列
      ThreadFactory threadFactory, 线程工厂,创建线程对象
      RejectedExecutionHandler handler 拒绝执行策略

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程、线程同步及其相关类、死锁、线程池 的相关文章

随机推荐

  • 一个很好用的 vue-picker组件

    vue picker a picker componemt for vue2 0 走了一圈 github 都没有找到自己想要的移动端的 vue picker的组件 于是自己就下手 撸了一个出来 感受下效果图 demo demo 地址 htt
  • Gradle查看第三方依赖关系图

    1 使用Android Studio Terminal 配置变量 前提是 java 和 Android Sdk配置正确 java version adb 进行验证 增加 变量名 GRADLE HOME 变量值 D gradle gradle
  • 期货开户不要过度交易

    不同状态下的心态管理 若你在昨日的交易中有所斩获 那恭喜你取得了小阶段的胜利 你可以自信而放松 但却不可忘乎所以 请记得你做出正确决策时的感觉 并重复此状态在你的下一次交易中 只有在交易时集中注意力观察行情变化 勇敢果断地应对突发变化 你才
  • 【笔记】状态同步笔记

    状态同步位置和技能 适用于fps和mmorpg类游戏 客户端A的同步阀值 减少同步量 客户端A本地会存储一份对其他客户端看到的A的预测状态 当本地真实状态和预测状态偏差超过阀值时 则发起同步 同时更新客户端A本地的预测状态 玩家运动的关键点
  • QT学习笔记(六)

    第11章 容器类 Qt提供了自己的容器类 在编写Qt程序时 既可以使用Qt容器 也可以使用STL容器 连续容器 1 向量QVector
  • 计算机丢失d3dx9_41.dll,d3dx9_41.dll

    不知道怎么下载 点我 游戏介绍 d3dx9 41 dll 当运行程序或者游戏时 系统弹出错误提示 找不到 d3dx9 41 dll 或者 没有找到 d3dx9 41 dll 时 说明您系统中缺失这个dll文件或者该dll文件没有被注册 您需
  • “视频云营业厅”-阿里云 mPaaS 加速金融机构数字化转型

    视频云营业厅 发布 蚂蚁 mPaaS 加速金融机构数字化转型 移动终端时代 随着 5G 基础设施的高速发展 AI 技术的日渐成熟 相关政策的鼓励和加持 以及当前疫情大环境的催化 远程无接触的业务办理方式由创新模式快速走向通用 通过多媒体音视
  • Doris数据模型

    目录 基本概念 Aggregate 模型 示例1 导入数据聚合 示例2 保留明细数据 示例3 导入数据与已有数据聚合 Unique 模型 读时合并 与聚合模型相同的实现方式 写时合并 Duplicate 模型 聚合模型的局限性 Unique
  • 【常见错误】UART接收不到数据错误

    利用FPGA控制DAC产生波形的实验 在完成利用FPGA控制DAC的实验中 在对UART发送数据时 显示中断已经打开 但是把数据发送过去时 并没有显示中断 相当于数据知识发送出去 而没有被接收到 经过debug后 发现原来是在硬件中 viv
  • python上传Excel文件

    python上传Excel文件 方法一 直接使用requests的data files参数 方法二 使用MultipartEncoder 方法一 直接使用requests的data files参数 直接上代码吧 def import car
  • python基础(一)

    python基础 1 数据类型 整数 浮点数 字符串 布尔值 True False 注意大小写 空值 是none 列表list 相当于别的语言里的数组 字典 2 编码设置与注释 编码 coding utf 8 注释 使用 或者是 和 这种表
  • redis的编译安装

    下载 http download redis io releases redis 5 0 8 tar gz tar xzvf redis 5 0 8 tar gz cd redis 5 0 8 hadoop node1 redis 5 0
  • 8位二进制数的原码、反码、补码以及它能表示的范围

    1 正数的反码和补码都与原码相同 2 而负数的反码为对该数的原码除符号位外各位取反 3 负数的补码为对该数的原码除符号位外各位取反 然后在最后一位加1 1 原码表示法规定 用符号位和数值表示带符号数 正数的符号位用 0 表示 负数的符号位用
  • 【Kubernetes存储篇】StorageClass存储类动态生成PV详解

    文章目录 一 StorageClass存储类理论 二 案例 Storageclass存储类实战演示 1 搭建NFS服务端 2 搭建NFS供应商 provisioner 3 创建StorageClass存储类 4 创建PVC 通过Storag
  • 2023年1月9日--1月15日(osg+glsl+ue+socket,42小时,合计1859小时,剩余8141小时)

    目前 ue视频教程进行到了mysql 7 1 tf1 4 11 oss 12 2 蓝图反射 1 9 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 57 Opengl 5 9 GLSL 2 8 周一到
  • Conda建立虚拟环境及torch安装

    本人的系统环境 Ubuntu 16 04 Cuda 9 0 Cudnn 7 0 5 Python 3 7 Anaconda 3 这里推荐大家使用Anaconda 可以比较方便的创建Python虚拟环境 避免不同的Python库之间产生冲突
  • C语言-基本运算

    1 除法运算 整数除于整数 还是整数 参与运算的操作数必须是同类型 1 2的值是0 参与运算的操作数是什么类型 得出的值就是什么类型 10 5 10将右边的10提升为了double类型 自动类型提升 int b 10 5 1 7 自动将大类
  • 李宏毅 - 卷积神经网络(CNN)

    李宏毅 卷积神经网络 CNN 卷积神经网络主要用于图像分类 一张图片通过我们的卷积神经网络也就是Model计算出概率值 通过Cross entropy 交叉熵 归一化到0和1 概率最大的显示为1 其余显示为0 那么一张图片是怎么输入到Mod
  • php批量保存网页上的图片,php网络图片下载至本地(可批量下载)

    class dlImageByWeb 下载图片 public function dl url dir orgName 0 state file get contents url 0 null 0 1 获取网络资源的字符内容 dlDir di
  • 多线程、线程同步及其相关类、死锁、线程池

    多线程 线程创建 1 自定义类继承Thread 重写run Thread t new 自定义类 t start jvm会调用t的run方法 同时当前线程会返回调用处 继续往下执行 2 实现Runnable 实现run Thread t ne