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

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(使用前将#替换为@)

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

  • Eclipse Package Explorer:隐藏部分长包名称?

    我一直在寻找一个让我烦恼了一段时间的 问题 但没有任何运气 我正在开发一个Android应用程序 其包名相当长com kennethbrodersen simplecaster 该项目包含许多子包 问题是所有这些包在包资源管理器中都显示有完
  • 如何在 Spring Boot 中创建 Apache POI Excel 视图配置

    当我想使用 Spring Boot Web 将数据导出到 Excel 时遇到问题 我使用 Thymeleaf 作为模板引擎 由 Spring Boot 自动配置 但是当我在附加配置中添加 XmlViewResolver 时 由 XmlVie
  • Eclipse,在哪里更改当前调试行背景?

    任何人都可以向我指出具有以下设置的首选项页面DEBUG当前行背景颜色 我已经将几乎所有颜色更改为深色 但在调试时仍然对这个几乎白色的当前行指示器感到恼火 请注意 编辑模式下的当前行指示是可以的 好吧 现在我自己找到了它 通过主要的逆向工程
  • 尝试使用 Eclipse 启动 Glassfish 服务器时出现 org.apache.catalina.LifecycleException

    我一直忙于使用 angularjs 前端构建一个 REST 应用程序 使用 MAVEN jersey quickstart webapp 使用 GLASSFISH Web 服务器在 Eclipse 上开发 今天 当我开始对项目进行一些开发时
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • Eclipse 中的字/行计数工具

    有没有任何工具或插件可以做到这一点 CodeBlock 有这个简洁的工具 非常好 不知道它是否可以在 Eclipse 上使用 谢谢 http metrics sourceforge net http metrics sourceforge
  • 在 Eclipse 工作区中搜索字符串

    如何在完整的eclipse工作区中搜索字符串 我无法在 Eclipse 工作区中找到文本 但是我无法在工作区中找到指定的字符串 在顶层菜单中 选择 搜索 gt 文件搜索 然后在底部附近 在范围内 有一个选项可以选择整个工作区 为您 文件搜索
  • 创建新的 Eclipse 插件项目时何时选择“生成激活器...”

    有很多 Eclipse RCP 教程都从明显的第一步开始 创建一个新的插件项目 看来大约 其中 70 指定检查 生成一个激活器 一个控制插件生命周期的Java类 其他人特别说不要检查该切换 替代文本http img179 imageshac
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • 透视切换面板在 Eclipse 中消失

    Eclipse 崩溃后 小透视切换窗格从 Eclipse 窗口的右上角消失了 我下载了最新版本并尝试打开它 使用相同的工作区 但按钮仍然消失 这是一个屏幕截图 并放大 有任何想法吗 我仍然可以通过选择 窗口 gt 打开透视图 来切换透视图
  • Eclipse:缺少 Java 构建路径

    我正在尝试使用 Eclipse 来使用适用于 Android 的 Google SDK 教程 我能够让前两个项目正常工作 但是当运行第三个 R java 时消失了 所以我放弃了 我根据练习 3 的解决方案集制作了一个全新的包 它充满了错误
  • 无法在 Eclipse 中连接到虚拟机

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 当我尝试在 Eclipse 上调试任何项目时 我突然开始遇到这个奇怪的错误 我不记得有什么改变让这个问题突然出现 Launch
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 模拟器无法加载

    我正在使用 hello android 教程并通过 eclipse 创建 avd 启动模拟器时不使用图像 它只是显示一个黑色的后屏 中间有 ANDROID 字样 并且在 ANDROID 字样的末尾有一个闪烁的光标 我已按照 T 的步骤安装
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 当对phonegap应用程序进行更改时,Eclipse不更新apk

    已经有人问过这个问题 但没有一个答案有效 例如清理 刷新 更改版本号等 当对源文件进行更改时 Eclipse 不会重建 android 项目 这是一个phonegap应用程序 如果我更改html文件甚至java代码 我仍然得到相同的apk
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 无法加载 JNI 共享库 (JDK)

    当我尝试打开时Eclipse http www eclipse org 弹出对话框指出 无法加载 JNI 共享库 C JDK bin client jvm dll 此后 Eclipse 强制关闭 我想提出以下几点 我检查了这条路径上是否存在
  • Eclipse:切换选项卡最大化/最小化的热键

    通常 当我在 Eclipse 中工作时 我会处于一个视角 例如调试 并在那里做一些事情 然后我想最大化我正在查看的文件 我双击它并对其进行处理 然后再次双击以最小化回到调试视角 是否有一个热键可以从键盘上执行此操作 Ctrl M will

随机推荐

  • 一个很好用的 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