Java线程基础

一、相关概念

1、程序
    为完成任务,用某种语言编写的一组指令的集合。
2、进程
    进程是指运行中的程序。
    进程是程序的依次执行过程,或是正在运行的一个程序,是一个动态过程:有自身产生、存在和消亡的过程。
3、线程
    线程是由进程创建的,是进程的一个实体。
    一个进程可以拥有多个线程,线程也可以创建线程。
4、单线程
    同一时刻,只允许执行一个线程。
5、多线程
    同一时刻,可以执行多个线程。
6、并发
    同一时刻,多个任务交替执行,看起来像是"同时"进行,单核CPU实现多任务就是并发。
7、并行
    同一时刻,多个任务同时进行。多核CPU可以实现并行。

二、线程的基本使用

1、创建线程
    ①继承Thread类,重写run方法
    ②实现Runnable接口,实现run方法
    
Thread子类直接使用即可,即重写其run()。
Runnable接口使用:
    下图为Runnable接口的定义,可见其只有一个run()方法,并无start()等方法。
    
解决方法:
     —代理模式
    可见Thread类实现了Runnable接口
    利用多态解决:
        Thread类构造器:
            
        可见,其有构造器,需要传入一个实现了Runnabel接口的类。
        这样便可以将实现了Runnable接口的类变成一个Thread类的对象
        然后使用Thread类的方法了。
    
2、机制
        (可以使用 jconsole( JVM可视化监控工具 )来监测线程,在终端输出jconsole即可 )
如下图:
    ①程序启动后,将自动创建一个mian线程。
    ②在main线程中,又启动了一个新的线程myThread(因为其继承了Thread,可以当作一个线程使用)
    ③这时就有两个线程,且两个线程同时执行,并发或并行, 不会阻塞。
    
3、为什么使用start(),而不是run()
    
①run()方法就是一个普通方法,调用它就是调用一个普通方法,不会开启一个线程。
②而start()方法则是会开启一个线程(源码):
    如下图,调用Start方法,会先将该线程加入到group当中
    然后使用 本地方法start0()方法将线程启动,该方法会调用本线程的run()方法。
    
    
4、线程方法
1、线程终止(不是自带方法)
    ①在线程完成任务之后,会自动退出。
    ②还可以通过 使用变量控制run方法退出的方式来停止线程,即通知方式。
        比如在run()方法循环条件里使用一个变量,然后main方法可以改变该变量的值。
2、setName()
    设置线程名称
3、getName()
    返回线程名称
4、start()
    执行该线程。
        底层调用start0(),然后start0()会调用run()
5、run()
    调用run()方法,一个普通方法。
6、setPriority()
    更改线程优先级
    
7、getPriority()
    获取线程优先级
8、sleep()
    休眠该线程指定的时间
9、interrupt()
    中断线程,并不是真正结束线程。一般用于中断休眠的线程。
        一个线程在未正常结束之前, 被强制终止是很危险的事情. 
        因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。
        那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢?
        一个比较优雅而安全的做法是: 使用等待/通知机制或者给那个线程一个中断信号, 让它自己决定该怎么办。
10、yeild()
    线程的礼让,让出CPU。
    使得正在运行的线程变成就绪状态,重新变成就绪状态,然后重新竞争CPU的调度权。
    但是它可能会获取到,也有可能被其他线程获取到。
    或者多核,且竞争不激烈,就可能让不成功。
11、join()
    线程插队。插队的线程一旦插队成功,则先执行完插入线程的所有任务。

三、用户线程和守护线程

1、用户线程
    也叫工作线程,当线程任务执行完或通知方式结束。
2、守护线程
    一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束。
    例如:垃圾回收机制
    如果希望当前线程结束,子线程自动结束,只需要将子线程设为守护线程:
        ChildThread.setDaemon(true);    (注意,需要在线程start之前设置为守护线程)

四、线程声明周期

Thread.State枚举类中说明了以下状态:
  • NEW
    尚未启动的线程处于此状态。
  • RUNNABLE
    在Java虚拟机中执行的线程处于此状态。该状态可细化为两个状态:
    • RUNNING:运行状态
    • READY:就绪状态,等待分配资源运行。
  • BLOCKED
    被阻塞等待监视器锁定的线程处于此状态。
  • WAITING
    正在等待另一个线程执行特定动作的线程处于此状态。
  • TIMED_WAITING
    正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
  • TERMINATED
    已退出的线程处于此状态。
         

五、线程同步(Synchronized)

1.同步
    在多线程编程中,一些敏感数据不允许被多个线程同时访问。 此时就使用同步访问技术,
保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
也可以理解为:
    当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该
线程完成操作,其他线程才能对该地址进行操作。
2.实现同步的具体方法
①同步代码块
    synchronized(对象){ //得到对象的锁,才能操作同步代码
        //代码
    }
②synchronized放在方法中,即同步方法
    public synchronized void fun(){
    }
3.互斥锁
①Java语言中引入了 对象互斥锁的概念,来保证共享数据操作的完整性。
每个对象都有一个称为 "互斥锁"的标记,这个标记用来保证任何一刻,只能有一个线程访问该对象。
③当某个对象使用synchronized修饰的时候,表明该对象在任意时刻只能由一个线程访问。
④局限性:导致程序执行效率下降。
⑤同步方法(非static)的锁可以是this,也可以是其他对象(要求是同一个对象)。
    synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的 所有synchronized块
⑥同步方法(static)的锁为当前类本身。
     static synchronized是限制线程同时访问jvm中 该类的所有实例同时访问对应的代码块。且 一个类的所有静态方法公用一把锁
     如果在静态方法中,要使用同步代码块,则synchronized(这里填 类名.class )
4.锁的释放
①当前线程的同步方法、代码块执行完毕。
②当前线程在同步方法、代码块中遇到break、return。
③当前线程在同步方法、代码块中出现了未处理的 Error 和 Exception,导致异常结束
④当前线程在同步方法、代码块执行了wait()方法,当前线程暂停,释放锁。
以下情况不会释放锁:
①当前线程在执行同步方法、代码块时调用Thread.sleep()、Thread.yeild()方法暂停当前线程,不会释放锁。
②当前线程在执行同步方法、代码块时, 其他线程调用该线程的suspend()方法将该线程挂起,该线程不会释放锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拍视频麦克风什么牌子好?户外无线麦克风哪个牌子好,看本期文章

​无线领夹麦克风,作为现代音频技术的重要代表,已经广泛应用于各种场合。它不仅能提高演讲者的声音质量,还能增加演讲的互动性和生动性。然而,面对市场上众多的无线领夹麦克风产品,如何选择一款适合自己的设备成为了一…

产教协同|暴雨AI算力赋能传媒实践教学

近日,“第七届传媒实践教学创新研讨会暨中国高校影视学会实验教学专业委员会年会”在美丽的山城重庆成功举办。本次大会以“拥抱AI,融合共生”为主题,吸引了来自全国200多所高校、30多家企业以及700多位大视听实践教学产学研用各界专家、学者…

react跨组件通信Context

案例&#xff1a;现在有个父-子-孙组件 需要进行组件通信 import { useState } from "react"; // 创建上下文 const CountContext React.createContext();//子组件 const SonComponent (props) > {return (<div><h2>子组件</h2><Grandson…

便携式应急气象站:应急气象监测装备

TH-BQX5便携式应急气象站&#xff0c;作为现代气象监测的重要装备&#xff0c;以其独特的便携性、高效性和灵活性&#xff0c;在应急气象监测领域发挥着至关重要的作用。这类气象站不仅为灾害预警、环境保护、农业生产等多个领域提供了实时、准确的气象数据&#xff0c;还在突发…

记录一次Redisson使用synchronized和分布式锁不生效的原因

最近在开发的过程中&#xff0c;遇到了一个并发场景&#xff0c;用户进行方案复制的时候&#xff0c;当快速点击两次操作的时候&#xff0c;出现了复制方案重名的情况&#xff0c;实际上是复制方案的方案名称&#xff0c;是由后端根据数据库已有的方案名称和当前要复制的方案名…

Hugging face win使用教程(二)

1. 将环境迁移到win&#xff0c;可以直接下载修改好的cuda环境https://download.csdn.net/download/liangjiubujiu/89368302?spm1001.2014.3001.5503 2. 修改hugging face的缓存路径 3. 重启pycharm 4. 编写测试代码&#xff0c;注意可能由于网络链接问题&#xff0c;需要关…

Parasoft C++Test软件静态分析操作指南_编码规范/标准检查

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

嵌入式进阶——OLED显示器(SPI)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 SPI协议原理图字库芯片中文显示屏原理API的使用 SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行…

嵌入式要卷成下一个Java了吗?

嵌入式要卷成下一个Java了吗&#xff1f; 根据我十年的嵌入式开发经验&#xff0c;嵌入式开发的工资水平相对 Java 较低。不过&#xff0c;嵌入式开发岗位主要集中在第二产业&#xff0c;尤其是电器、电气、机械汽车、航空航天等行业的“智能制造”领域。这些行业属于重资产行…

JWT身份验证相关安全问题

前言&#xff1a;工作中需要基于框架开发一个贴近实际的应用&#xff0c;找到一款比较合适的cms框架&#xff0c;其中正好用到的就是jwt做身份信息验证&#xff0c;也记录一下学习jwt相关的安全问题过程。 JWT介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行…

线上自由DIY预约小程序源码系统 自由DIY你的界面 带完整的的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;移动应用成为人们生活和工作中不可或缺的一部分。预约小程序作为一种便捷的工具&#xff0c;为用户提供了高效的预约服务体验。而线上自由 DIY 预约小程序源码系统则为开发者和企业提供了更大的自由度和创造力&#xff0c;让他们能够根据…

Redis篇 String的基本命令

String基本命令 一.setnx,setex,psetex二. 增加删除命令三.append,setrange,getrange,strlen命令1.append2.setrange3.strlen4.getrange 四.String的内部编码方式 一.setnx,setex,psetex setex和psetex设置过期时间 setex设置的过期时间是秒级 psetex设置的过期时间是毫秒级 二…

11.任务状态查询API函数总结

一、任务相关 API 函数预览 二、任务相关 API 函数详解 1. 函数 uxTaskPriorityGet() 此函数用于获取指定任务的任务优先级&#xff0c;若使用此函数&#xff0c;需在 FreeRTOSConfig.h 文件中设 置配置项 INCLUDE_uxTaskPriorityGet 为 1&#xff0c;此函数的函数原型如下所示…

我和jetson-Nano的故事(12)——安装pytorch 以及 torchvision

在jetson nano中安装Anaconda、pytorch 以及 torchvision 1.Pytorch下载安装2.Torchvision安装 1.Pytorch下载安装 首先登录英伟达官网下载Pytorch安装包&#xff0c;这里以PyTorch v1.10.0为例 安装依赖库 sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev liba…

HNU-人工智能-2024期末考试回忆

前言 后知后觉&#xff0c;似乎是别的专业的往年试题拿来复用&#xff0c;我没刷到&#xff0c;比较吃亏。 最后一题把数据改的很恶心&#xff0c;让我cosplay成GPU&#xff0c;算3个5*5的卷积核&#xff0c;简直恶心。根本没时间算完。 整场考试体验还挺差的。主要是老师缝…

FreeRTOS【7】队列使用

1.开发背景 操作系统提供了多线程并行的操作&#xff0c;为了方便代码的维护&#xff0c;各个线程都分配了专用的内存并处理对应的内容。但是线程间也是需要协助操作的&#xff0c;例如一个主线程接收信息&#xff0c;会把接收的信息并发到其他线程&#xff0c;即主线程不阻塞&…

helm离线安装

目录 概述实践 概述 centos 7.x 离线安装 helm 3.14.4 版本 实践 离线包资源下载地址 github [roothadoop01 ~]# tar -xvf helm-v3.14.4-linux-amd64.tar.gz linux-amd64/ linux-amd64/README.md linux-amd64/LICENSE linux-amd64/helm [roothadoop01 ~]# mv ./linux-amd…

Deepin Linux 深度 V23 beige 官方源及换镜像源方法。

Deepin Linux 深度 V23 英文版本号&#xff1a;beige 谁起的烂名字。。。。。。 1. 打开文件管理器&#xff0c;在apt文件夹点右键&#xff08;以管理员身份打开&#xff09;&#xff0c; 2. 输入你的登录密码&#xff0c;以便打开文件夹&#xff08;管理员权限&#xff09;。…

【会议征稿,JPCS出版】2024年航空航天与力学国际学术会议(ICAM 2024)

2024年航空航天与力学国际学术会议&#xff08;ICAM 2024&#xff09;将于2024年7月12-14日在中国沈阳举办。会议由东北大学机械工程与自动化学院主办&#xff0c;吉林大学机械与航空航天工程学院承办&#xff0c;大连理工大学、沈阳航空航天大学、沈阳建筑大学、沈阳工业大学、…

微火全域运营平台成优选,业内人士纷纷研究!

随着全域运营赛道的兴盛&#xff0c;越来越多的全域运营平台陆续上线&#xff0c;拓宽全域运营服务商选择空间的同时&#xff0c;也让全域运营平台选择成为了他们最为头疼的问题。在此背景下&#xff0c;各大全域运营平台背后的研发公司开始各出奇招&#xff0c;以获得更多全域…