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

JAVA多线程机制

JAVA多线程的实现

JAVA有两种方法创建线程
(1)继承Thread类
(2)实现Runnable接口
这两种方法都要用到Thread类以及相关方法

Thread类

是一个具体的类,不是抽象类,封装了线程的行为
利用Thread类创建一个线程,必须创建一个从Thread类导出的新的子类,必须覆盖Thread的run()方法来完成线程的工作
当线程启动时必须调用Thread的start()函数

Runnable接口

该接口只有一个函数run(),此函数必须由实现了此接口的类实现
当使用该接口时,不能直接创建所需类的对象并运行它,必须从Thread类的一个实例内部运行它

既然有了Thread类,为什么还需要Runnable接口?
JAVA是单继承多实现,一个JAVA类只能继承一个父类,但可以同时实现多个接口。如果一个类已经继承了一个其他的父类,又要实现多线程时,那么就不能继承Thread类来实现,而要通过Runnable接口定义多线程

多线程程序编写关键操作

(1)定义用户线程的run()方法
(2)用new创建对象,建立用户线程实例
(3)启动线程,调用线程对象的start()方法

利用Thread子类创建线程

写一个子类继承Thread类并覆盖其中的run方法,run中的代码就是线程要实现的功能;
创建子类对象;
start方法启动线程

Runnable接口创建线程

定义一个Thread类对象,利用Thread构造方法,将本类作为参数传递给Thread对象

互斥

当多个线程需要访问同一资源,而这一资源在某一时刻只允许一个线程访问,则这些线程是互斥的

同步

多个线程需要访问同一资源,而且需要相互配合才能正常工作,则这些线程运行时就是一种同步关系

临界区

存放共享资源的区域一次只允许一个线程进入,该区域被称为临界资源。线程在访问共享资源前需要进行检查,看自己能否对该资源访问。如果有权访问,还需要阻止其他线程进入该区域

死锁

多个线程相互等待其他线程释放资源,且所有线程都不能释放自己所占用的资源,从而导致相关线程处于永远等待的状态

信号量

用于解决进程间的互斥和同步
信号量的设置必须使用PV原语

PV原语方法及关键字

public final void wait() 告知被调用的线程放弃管程进入睡眠,直到其他线程进入相同管程并调用notify(),将本线程转入阻塞状态

public final void notify() 恢复相同对象中第一个调用wait的线程

public final void notifyAll() 恢复相同对象中所有调用wait的线程,具有最高优先级的线程最先运行

synchronized 标志被同步使用的资源,系统为资源分配管程,保证在某一时间内,只有一个线程对象在享有这一资源,也被称为对象锁

线程互斥步骤

设置一个各个线程共享的信号量,值为true或false
线程需要访问共享资源前,先检测信号量的值。如果不可用,则调用wait()转入等待状态
如果可用,则改变信号量的状态,不让其他线程进入
访问完共享资源后,再修改信号量状态,允许其他线程进入
调用notify()或notifyAll(),唤醒其他等待的线程

线程的同步

为了实现线程之间严格交替运行,需要对线程进行同步控制
两个需要同步的线程会根据信号量的值,判断自己能否进入临界区。比如,一个线程只有当信号量为真时才能进入,而另一个则是假时进入
最后用对象名.notify()的当时唤醒指定的某线程类创建的线程对象

生产者消费者问题

设计一个公共类,并用该类创建一个对象,信号量和共享资源都以静态成员变量的形式存在于对象中。无论哪个线程对象访问的都是同一个信号量和共享资源
同样将生产方法和消费方法都封装到这个公共类中
信号量是介于[0,BUFFERSIZE]之间的整型数,因为缓冲区允许连续多个生产者或消费者线程进入

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

相关文章:

  • Element-plus安装及其基础组件使用
  • [产品管理-38]:创意、市场机会、商业可行性的区别
  • 开源标注工具
  • 数据结构讲解二叉树 【一】
  • MATLAB基础应用精讲-【数模应用】OR值
  • [vulnhub] w1r3s.v1.0
  • c#中的功能优势
  • Windows系统设置定时任务,周期性执行.bat文件
  • xQTLs 共定位分析(XQTLbiolinks包)
  • 网络工程(学习记录)
  • 全志A133 android10 适配EC20 4G模块
  • 数据分析:Python语言网络图绘制
  • 使用ChatGPT引导批判性思维,提升论文的逻辑与说服力的全过程
  • vue限定类型上传文件 最简单实践(单个可文件、可图片)
  • 【GUI设计】基于图像分割和边缘算法的GUI系统(7),matlab实现
  • 未来之窗VOS编程工具让你的工作效率翻倍———未来之窗行业应用跨平台架构
  • 分布式数据库——HBase基本操作
  • Go语言并发编程中的超时与取消机制解析
  • Unity3D UIdocument如何改变层级详解
  • Debian与Ubuntu:深入解读两大Linux发行版的历史与联系
  • GPU服务器本地搭建Dify+xinference实现大模型应用
  • 嵌入式程序设计经验 创建复位函数
  • 每天五分钟深度学习框架pytorch:交叉熵计算时的维度是什么?
  • 【Axure视频教程】跨页面控制中继器表格
  • Android 利用OSMdroid开发GIS 添加 控件以及定位
  • 前端vue-实现富文本组件
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制(中)
  • 国内可用ChatGPT-4中文镜像网站整理汇总【持续更新】
  • 前端sm2国密加密时注意
  • LeetCode 面试经典150题 9.回文数