multithreading基础知识

multithreading基础知识

概念

OS、程序、进程、线程

  • 操作系统 ( Operation System )
  • 应用程序 ( application )
  • 进程 ( process ):进程是最小的系统资源分配单位
  • 线程 ( thread ):轻量级的进程,一个进程内部可以有多个线程,线程是最小的执行单位

调度方式

  • 协作式
  • 抢占式

并发

  • 在极短的某个时间段内,多个程序都完成了从启动到执行完毕的过程,并且都在同一个CPU中执行
  • 单核单线程的CPU中同一时刻只能执行一个任务

并行

  • 在多个CPU中同时执行多个程序,他们都完成了从启动到执行完毕的过程

执行线程

当前线程

  • 通过调用 Thread.currentThread() 来获取当前 执行线程 的引用
  • 那个线程调用了 currentThread 方法就返回那个线程

Thread类

  • 在Java语言中与正在运行的线程对等被称作 执行线程
  • 表示 执行线程 的 Java 对象 的类型一定是 java.lang.Thread 类型

创建方式

  • 继承Thread类

    • Step 1 : 自定义一个继承Thread类并重写其run()方法的类
    • Step 2 : 创建 Thread实例 ( 即创建Thread子类的实例 )
    • Step 2 : 调用 Thread实例 的 start() 方法启动线程
  • 实现Runnable接口

    • Step 1 : 自定义一个实现Runnable接口并实现其run()方法的类
    • Step 2 : 创建 Runnable实现类 的实例
    • Step 3 : 创建 Thread实例 ( 将Runnable实例传递给Thread实例 )
    • Step 4 : 调用 Thread实例 的 start() 方法启动线程
  • 利用线程池实现

    • Step 1 : 创建线程池

    • Step 2 : 创建任务

      • 通过创建 Runnable实现类 的实例来创建线程任务
      • 通过创建 Callable实现类 的实例来创建线程任务
    • Step 3 : 提交任务

    • Step 4 : 关闭线程池

main 线程

  • 含有 public static void main( String[ ] ) 的类就是启动类
  • 运行启动类时,JVM会创建并启动一个名称是 main 的线程
  • main 线程会调用 启动类 的main方法 (因此main方法必须是类方法)

线程状态

新建状态

就绪状态

运行状态

阻塞状态

死亡状态

线程调度

线程优先级

  • 优先级

    • Thread.MIN_PRIORITY
    • Thread.NORM_PRIORITY
    • Thread.MAX_PRIORITY
  • 获取优先级

    • thread.getPriority()
  • 设置优先级

    • thread.setPriority( priority )

线程睡眠

  • 通过调用Thread类的类方法实现

    • Thread.sleep( millis )
  • 那个线程调用了 Thread类的 sleep 方法就导致那个线程睡眠

  • 睡眠是阻塞状态(可以被中断)

  • Thread 类中的 sleep 方法是 【类方法】

线程让位

  • 通过调用Thread类的类方法实现

    • Thread.yield()
  • yield导致当前执行线程释放CPU让位给优先级大于等于当前线程优先级的线程

  • Thread 类中的 yield 方法是 【类方法】

线程插队

  • 一个线程等待另一个线程执行完毕再执行其后续操作
  • 设 x 线程调用了 y 线程的 join 方法,则 x 线程会等待 y 线程执行结束后再执行后续操作
  • Thread 类中的 join 方法是 【实例方法】

线程中断

  • 一个线程可以中断另一个线程的某种阻塞状态
  • 设 x 线程处于睡眠中,当 y 线程调用 x 的 interrupt 方法时就会中断 x 线程的睡眠
  • Thread 类中的 interrupt 方法是 【实例方法】

守护线程

  • 守护线程 也称作 精灵线程 或 后台线程
  • 非守护线程 也称作 前台线程 或 用户线程
  • 精灵线程 负责 守护 前台线程 的运行
  • 通过 Thread类中的实例方法 isDaemon 可以判断一个线程是否是守护线程
  • 通过 Thread类中的实例方法 setDaemon 可以将一个线程设置为守护线程
  • 所有的 守护线程 创建的 新线程 默认都是 守护线程
  • 所有的 非守护线程 创建的 新线程 默认都是 非守护线程

线程同步

同步

  • 同步绝对不是同时发生(或同时执行)

  • 同步应该理解为 协作运行 ( 多个线程安装约定的顺序依次执行 )

  • 实现方式

    • 临界区
    • 互斥对象
    • 信号量
    • 事件对象
  • 互斥可以看作是一种特殊的同步

同步锁

  • 多个线程竞争的对象就是同步锁
  • 同步锁在有些资料上也称作 监视器(monitor) 或 对象监视器

同步代码块

  • synchronized( 同步锁 ) {
    // 同步代码块
    }

同步方法

  • 被 synchronized 修饰的方法就是 同步方法
  • 对于 synchronized 修饰的【类方法】来说,其同步锁就是 当前类对应的 Classs实例
  • 对于 synchronized 修饰的【实例方法】来说,其同步锁就是 当前对象 (this)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值