一、线程基础知识

110 阅读3分钟

线程基础知识

进程与程序的区别

  • 程序是一种静态概念,是保存在磁盘上的一系列文件
  • 进程是一种动态概念,是运行中的程序,一个程序启动多个进程

进程与线程的区别

线程:

  • 线程是CPU资源分配的最小单元
  • 线程会共享进程中的内存,线程也有自己的独立空间(栈、程序计数器)
  • 线程相互通信更加方便

进程:

  • 进程是程序执行相关资源(内存,磁盘等)分配的最小单元
  • 进程是一系列线程的集合
  • 进程之间的资源是相互独立的

串行、并行和并发

  • 串行:多个指令依次执行
  • 并行:多个CPU内核同时执行多个线程,线程是同时执行的
  • 并发:在极短时间内,cpu在多个线程间切换,但是任意时刻都只有一个线程在运行

线程状态

在java代码中,线程有六种状态

  • NEW:Thread对象被创建出来,但是还没有执行start方法
  • RUNNABLE:调用了start方法。cpu调度或者没有调度都是这个状态
  • BLOCKED:一般没有拿到锁资源,会处于此状态
  • WAITING:在调用wait方法后,会处于此状态,需要手动唤醒
  • TIMED_WAITING:在调用sleep或者join方法后,会处于此状态,不用手动唤醒
  • TERMINATED:线程资源被回收,生命周期结束

image.png

线程常用方法

currentThread方法

  • 语法:Thread.currentThread()
  • 含义:获取当前线程对象

setName方法

  • 语法:线程对象.setName()
  • 含义:设置线程名称

setPriority方法

  • 语法:线程对象.setPriority()
  • 含义:设置线程优先级
  • 注意:优先级范围:1-10,值越大,优先级越高

yield方法

  • 语法:Thread.yield()
  • 含义:当前线程从运行状态变为就绪状态,让出cpu资源,但不会释放锁

sleep方法

  • 语法:Thread.sleep(毫秒值)
  • 含义:当前线程从运行状态变为TIMED_WAITING状态,但不会释放锁

join方法

  • 语法1:线程对象.join()
  • 含义:当前线程等待调用join方法的线程执行结束后才能往下执行,不会释放锁
  • 语法2:线程对象.join(毫秒值)
  • 含义:当前线程等待调用join方法的线程执行对应时间后才能往下执行,不会释放锁

setDaemon方法

  • 语法:线程对象.setDaemon()
  • 含义:调用方法的线程设置为守护线程
  • 注意:JVM会在进程中没有普通线程时,结束掉JVM。由于主线程为普通线程,如果主线程结束,而JVM中也没有其他普通线程,JVM会直接停止,不会管守护进程有没有执行完任务。

stop方法

  • 语法:线程对象.stop()
  • 含义:强制让线程结束
  • 注意:风险太大,一般不会使用

线程的等待和唤醒

wait方法可以让获得synchronized锁资源的线程释放锁,并且进入到锁的等待池中

notify或者notifyAll方法可以让获得synchronized锁资源的线程从等待池中被唤醒,进入锁池中

锁的等待池中的线程释放了锁资源,等待被唤醒。锁池中的线程已经被唤醒,会竞争锁资源,拿到锁资源后再执行代码

notify方法是随机唤醒一个线程,notifyAll方法是唤醒等待池中所有线程

调用wait、notify、notifyAll方法时,必须在synchronized修饰的代码块或者方法内才可以

线程中断

interrupt方法

  • 语法:线程对象.interrupt()
  • 含义:设置线程中断标志位为true

isInterrupt方法

  • 语法:线程对象.isInterrupt()
  • 含义:查看线程中断标志位,且返回

interrupted方法

  • 语法:Thread.interrupted()
  • 含义:查看线程中断标志位且返回,同时将标志位设置成false