多线程编程1.0——基础相关认识

Posted erfsfj-dbc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程编程1.0——基础相关认识相关的知识,希望对你有一定的参考价值。

多线程编程的基础相关认识

基本概念

  • 进程
    • 一个正在执行的程序,程序运行时系统会创建一个正在执行的程序,程序运行时,系统会创建一个进程,并且给每个进程分配独立的内存地址空间保证每个进程地址不会相互干扰。同时,在cup对进程做时间片的切换时,保证进程切换过程中仍然做进程切换之时运行的位置开始执行。所以进程通常还会包含程序计数器、堆栈指针。
  • 线程
    • 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
  • 并行
    • 从宏观与微观角度都是有多个执行者同时执行
  • 并发
    • 多个任务被执行,但执行者只有一个,因为执行的速度与切换任务执行的速度非常快,所以在宏观角度上看上去像同时执行的效果。
  • 程序计数器
    • 在程序执行时,程序计数器会实时,记录当前执行到的行数

java中实现多线程的方式

  • 继承Thread类
    • 继承Thread类,重写run方法,在需要开辟新线程的地方实例化这个继承了Thread类的类,调用start()方法,即可启动一个新的线程。
    • 补充:start()方法会调用本地方法start0(),分配一个新的线程,并会回调run()方法
  • 实现Runnable接口
    • 实现Runnable接口,实现Runnable的run()方法,在需要开辟新线程的地方实例化这个实现了Runnable接口的类,调用start()方法,即可启动一个新的线程。
  • 实现Callable接口
    • 与上述实现Runnable接口用法类似,区别在于此方式可以带返回值Futrue实例,根据需求而定方式。
  • 通过线程池获取线程
    • jdk并发包的内置线程池结构图

线程的生命周期

  • NEW
    • 初始状态,线程被构建,但是还没有调用start方法
  • RUNNABLE
    • 运行状态,JAVA线程把操作系统中的就绪 和运行两种状态统一称为“运行中”
  • BLOCKED
    • 阻塞状态,表示线程进入等待状态,也就是线程 因为某种原因放弃了CPU使用权,阻塞也分为几种情况
      • 等待阻塞:运行的线程执行 wait 方法,jvm 会把当前 线程放入到等待队列
      • 同步阻塞:运行的线程在获取对象的同步锁时,若该同 步锁被其他线程锁占用了,那么 jvm 会把当前的线程 放入到锁池中
      • 其他阻塞:运行的线程执行Thread.sleep或者t.join方 法,或者发出了 I/O 请求时,JVM 会把当前线程设置 为阻塞状态,当sleep结束、join线程终止、io处理完 毕则线程恢复
  • WAITING
    • 一个线程进入了锁,但是需要等待其他线程执行某些操作。时间不确定,当wait,join,park方法调用时,进入waiting状态。前提是这个线程已经拥有锁了。
  • TIME_WAITING
    • 超时等待状态,超时以后自动返回
  • TERMINATED
    • 终止状态,表示当前线程执行完毕
  • 线程的终止补充
    • 线程的终止,并不是简单的调用stop命令去。虽然api仍 然可以调用,但是和其他的线程控制方法如 suspend、 resume 一样都是过期了的不建议使用,就拿 stop 来说, stop方法在结束一个线程时并不会保证线程的资源正常释 放,因此会导致程序可能出现一些不确定的状态。 要优雅的去中断一个线程,在线程中提供了一个thread.interrupt() 方法,线程通过检查资深是否被中断来进行相应,底层调用本地interrupt0(),可以通过isInterrupted()来判断是否被中断。
    • 线程的复位
      • 外面的线程调用 thread.interrupt()来设置中断标识,而在线程里面,又通过 Thread.interrupted() 把线程的标识又进行了复位
      • 被动复位的场景,就是对抛出 InterruptedException 异 常 的 方 法 , 在 InterruptedException 抛出之前,JVM 会先把线程的中断 标识位清除,然后才会抛出InterruptedException,这个时 候如果调用isInterrupted方法,将会返回false

以上是关于多线程编程1.0——基础相关认识的主要内容,如果未能解决你的问题,请参考以下文章

JAVA并发编程揭开篇章,并发编程基本认识,了解多线程意义和使用

JAVA并发编程揭开篇章,并发编程基本认识,了解多线程意义和使用

Java EE-多线程编程 认识线程

Java并发编程系列之二线程基础

并发编程8:多线程基础-JDK中的线程演化路线

5天玩转C#并行和多线程编程