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()的作用时唤醒一个或所有正在等待队列中等待的线程,并将它们移入等待同一个对象互斥锁队列

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值