• 04747 java程序设计笔记 --多线程


    在这里插入图片描述

    文字篇

    线程概念

    • 进程

      • 程序在处理机的一次运行,(从代码加载,执行至完毕的一个完成过程)
    • 线程

      • 进程执行过程中产生的多条执行线索,比进程单位更小的执行单位。
      • 它没有出口,没有入口,因此自身不能自动运行,而必须栖身于某一进程之中,有进程触发执行。
    • 多线程

      • java语言把线程或执行环境当作一个封装对象,包含CPU以及自己的程序代码和数据,由虚拟机提供控制。
      • Thread类,创建多线程

    线程结构

    • 虚拟CPU

      • 控制整个线程的运行
    • 执行的代码

      • 由Thread类控制按序执行
    • 处理的数据

      • 是在代码执行过程中索要处理的数据。

    线程的状态

    • 新建

      • new Thread()
    • 可运行

      • 已经执行start()方法后,可使线程处在可运行状态
      • 可运行但没在运行的线程都排在一个队列中,这个队列是就绪队列,
      • 可运行状态中,正在运行的线程处于运行状态,等待运行的线程处于就绪状态。
    • 死亡

      • 当run()方法中最后一个语句执行完毕,及死亡
      • 当线程遇到异常退出时便进入了死亡状态
    • 阻塞

      • 阻塞时线程不能进入就绪队列排队,必须要等到消除阻塞才可以重新进入队列排队
      • sleep() wait()是两个常用的引起阻塞的方法
    • 中断线程

      • interrupt()来终止线程,可终止处于阻塞状态或者正在运行的线程

      • 测试线程是否被中中断的方法

        • void interrupt()

          • 向一个线程发送一个中断请求,同时把这个线程的interrupted状态设置为true,若该线程处于blocked状态,会抛出InterruptedException异常
        • static boolean interrupted()

          • 检测当前线程是否已被中断,并充值状态 interrupted值,如果连续两次调用该方法,则第二次调用将返回false
        • boolean isInterrupted()

          • 检测当前线程是否已被中断,不改变状态 interrupted 值

    创建线程

    继承Thread类创建

    • 步骤

      • 从Thread类派生一个子类,在类中一定要实现run()
      • 用该类创建一个对象。
      • 用start()方法启动线程。

    实现Runnable接口创建

    • 创建一个实现Runnable()接口的类
    • 用该类创建对象
    • 用start()方法启动线程

    创建线程两种方法的使用条件

    • 使用Runnable接口方法情况

      • 需要多继承的情况
    • Thread方法情况

      • 单继承
      • 简单不繁琐

    线程的基本控制

    线程启动

    • start()

      • 启动线程对象,让线程从创建状态转为就绪状态
    • run()

      • 用来定义线程对象被调度后所执行的操作,用户必须重写run()方法
    • yield()

      • 强制终止线程执行
    • isAlive()

      • 测试当前线程是否在活动
    • sleep(int millsecond)

      • 使线程休眠一段时间,试驾你长短由millsecond决定,单位为ms
    • void wait()

      • 是现成处于等待状态

    线程调度

    • 定义

      • 调度通常是抢占式,抢占式调度是值可能由多个线程准备运行,但是只有一个在真正运行
    • 优先级

      • 优先级高的先执行

        • MAX_PRIORITY = 10(最高)
        • MAX_PRIOPITY = 1 (最低)
        • MAX_PRIOPITY = 5 (默认)
      • 每个线程创建时都会被自动分配一个优先级,默认时,继承其父类优先级

      • 任务紧急的线程,其优先级较高

      • 同优先级的线程 先进先出 原则

    • 方法

      • setPriority(int newPriority)

        • 重置线程优先级
      • int getPriority()

        • 获得当前线程的优先级
      • static void yield()

        • 暂停当前正在执行的线程,让当前线程放弃执行权

    线程结束

    • 自然死亡

      • run()方法执行到最后一行
    • 强迫死亡

      • interrupt()方法中断线程执行

    线程挂起

    • 暂停一个线程 也称挂起

    • 方法

      • sleep()

      • wait() / notify() / notifyAll()

        • wait()方法导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法唤醒
      • join()

        • 将引起线行线程等待,直至join()方法 调用的线程结束

    线程互斥

    何为互斥

    • 同时运行的数据需要共享数据,如何保证共享数据的一致性

    对象的锁定标志

    • 目的

      • 互斥锁来解决不同线程对共享数据操作的同步
    • 实现互斥锁

      • 用volatile关键词声明一个共享变量
      • 用Synchronized来声明操作共享数据的一个方法或一段代码

    线程同步

    同步问题

    • 生产者比消费者快,消费者会漏掉一些数据没有取到
    • 消费者比生产者快时,消费者取相同的数据

    解决问题

    • 第一用来排列等待锁定标志的线程

    • 第二用来实现wait()和notify()的交互机制

      • wait()作用时让当前线程释放其所持有的对象互斥锁,进入wait队列

        • wait()方法只能在被声明的synchronized的方法或代码段中调用。
      • notify()/notifyAll()的作用时唤醒一个或所有正在等待队列中等待的线程,并将它们移入等待同一个对象互斥锁队列

  • 相关阅读:
    Go 复合类型之字典类型介绍
    一个反向代理神器 ——Nginx Proxy Manager
    【soc】bootrom注意事项
    分布式ID系统设计(1)
    矩阵论理论知识(三)特殊的线性空间
    SpringCloud
    【数据结构】树的概念与堆的实现
    105AspectRatio调整宽高比组件_flutter
    【python环境搭建】一台电脑下安装不同python版本时如何安装模块
    jQuery之事务相关操作
  • 原文地址:https://blog.csdn.net/qq_51347907/article/details/126843064