当前位置: 首页 > news >正文

并发前置知识一:线程基础

一、通用的线程生命周期:“五态模型”

IMG_0021 2.JPG

二、java线程有哪几种状态?

  1. New:创建完线程
  2. Runable:start(),这里的Runnable包含操作的系统的Running(运行状态)和Ready(上面的可运行状态)
  3. Blocked:等待一个排它锁,当java线程在调用阻塞api时(阻塞读取文件),是否会转到Blocked那?在jvm层面,java线程状态是不会发生变化,还是Runnable,因为jvm不关心操作系统调度,在jvm看来,等待cpu使用权(操作系统层面处于可运行状态)和等待i/o(操作系统此时处于休眠状态)没有区别,都是在等待某个资源,所以都归于Runnable状态。只有在等待获取隐式锁的时候,才会进入到阻塞状态。
  4. Waiting(无限期等待):等待其他线程显示的唤醒,否则不会被分配cpu时间片

image.png

  1. Time Waiting(限期等待):无需等待其他线程显式的唤醒,在一定时间之后会被系统自动唤醒

image.png
调用Thread.sleep方法会使得线程进入限期等待状态,常常用“使一个线程睡眠”描述
调用object.wait(xxx) 方法使得线程进入限期等待,常常用“挂起一个线程”描述

睡眠和挂起是一个动作,阻塞和等待是一个状态
阻塞和等待的区别在于,阻塞是一个被动的,它是在等待一个排它锁;等待(无论来自于sleep还是wait)是一个主动的,通过主动调用方法进入的

  1. Terminated: 1、线程正常执行完 2、线程被interrupt(这里是不建议使用stop的,如果用stop杀死线程的话,如果线程持有Lock锁,就不会调用unlock也就不会释放锁)。

另外:
Blocking、Waiting、Timed_Waiting这几种状态可以统一理解为休眠状态,当线程处于这几种状态时,线程是没有cpu的使用权的。

三、java线程之间状态切换是什么样的?

image.png

四、创建线程有哪些方式?

  1. 实现Runnable接口,然后传到Thread作为参数
  2. 实现Callable接口,然后将Callable接口传入到FutureTask中,再将FutureTask传入到Thread作为参数

image.png
Callable实现返回值,futureTask实现异步

  1. 直接继承Thread,重新run方法

五、interrupt方法

interrupt作为一种线程交互的方式,相比stop温柔多了。对于被interrupt的线程,如果想要接收通知,有以下2种方式:

  1. 异常

当线程处于 Waiting、Timed_Waiting状态时,如果其他线程调用线程A的interrupt方法,会使线程A返回到Runnable状态,同时线程A的代码会触发InterruptException异常。我们在调用wait、join、sleep方法,都能看的这些方法都会throws interruptException,这个异常的触发条件就是其他线程调用该线程的interrupt方法

当线程A处于Runnable,并且阻塞在java.io.channels.interruptiableChannel上时,如果其他线程调用A的interrupt方法,线程A会触发java.nio.channels.ClosedByinterruptException;而阻塞在java.nio.channels.Selector上时,如果其他线程调用线程A的interrupt方法,线程A会立即返回

  1. 主动检测

通过主动检测 thread.isInterupted方法,来判断自己是否被中断了

http://www.lryc.cn/news/278795.html

相关文章:

  • 计算机网络 物理层
  • 浅谈轻量级Kubernetes—K3s
  • Web APIs知识点讲解
  • Python商业数据挖掘实战——爬取网页并将其转为Markdown
  • 初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(1)
  • StampedLock详解
  • Linux中DCHP与时间同步
  • 国产系统-银河麒麟桌面版V10安装字体-wps安装字体
  • python 10常用自动化脚本收藏好
  • java物品检验管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • Pandas实战100例 | 案例 2: 数据探索 - 查看和理解数据
  • c++qt-基本组件
  • SpringBoot多环境配置Maven Profile组
  • 服务器配置 ssh 密钥登录
  • 使用递归将list转换成tree
  • untiy使用http下载资源
  • 03-编码篇-x264编译与介绍
  • 生活自来水厂污水处理设备需要哪些
  • Full names for abbreviations of Linux Commands
  • kafka下载安装部署
  • python包管理工具:pipenv的基本使用
  • AI系统ChatGPT网站系统源码AI绘画详细搭建部署教程,支持GPT语音对话+DALL-E3文生图+GPT-4多模态模型识图理解
  • MC-4/11/03/400步进电机驱动器的主要驱动方式有哪些?
  • 大数据技术原理与应用期末复习(林子雨)
  • C练习——魔术师猜三位数
  • three.js 使用 tweenjs绘制相机运动动画
  • Oracle VARCHAR和VARCHAR2区别
  • HarmonyOS 开发基础(八)Row和Column
  • Visual Studio中项目添加链接文件
  • 做一个个人博客第一步该怎么做?