多线程基本常识

news/2024/7/20 17:14:05/文章来源:https://blog.csdn.net/Flying_Fish_roe/article/details/139250345

多线程的状态

    在Java中,一个线程的生命周期有以下几种状态:

  1. 新建(New):当线程对象被创建时,线程处于新建状态。此时线程对象存在,但还没有调用start()方法启动线程。

  2. 运行(Runnable):当线程调用start()方法后,线程进入就绪状态,等待被分配CPU时间片执行。当线程获取到CPU时间片后,线程进入运行状态执行任务。

  3. 阻塞(Blocked):线程在执行过程中,可能会因为某些原因(如等待I/O操作、等待获取锁等)而暂时停止执行。此时线程进入阻塞状态,等待特定条件满足后重新进入就绪状态。

  4. 等待(Waiting):线程在执行过程中,可能会因为调用了wait()方法而进入等待状态。此时线程释放持有的锁,并等待其他线程调用notify()、notifyAll()方法唤醒自己。

  5. 超时等待(Timed Waiting):线程在执行过程中,可能会因为调用了sleep()方法或者带有超时参数的wait()方法而进入超时等待状态。超过指定时间后,线程会被自动唤醒并进入就绪状态。

  6. 终止(Terminated):线程执行完任务或者发生异常导致线程终止时,线程进入终止状态。

线程的状态之间的流转如下:

  1. 新建 -> 运行:调用start()方法启动线程,线程进入就绪状态等待CPU调度。

  2. 运行 -> 阻塞:线程在执行过程中,由于某些原因(如等待I/O操作、等待获取锁等)暂停执行。

  3. 阻塞 -> 运行:阻塞状态解除后,线程重新进入就绪状态等待CPU调度。

  4. 运行 -> 等待:线程调用了wait()方法,线程进入等待状态。

  5. 等待 -> 运行:其他线程调用了notify()、notifyAll()方法,或者等待时间到达,线程被唤醒并进入就绪状态。

  6. 运行 -> 超时等待:线程调用了sleep()方法或者带有超时参数的wait()方法,线程进入超时等待状态。

  7. 超时等待 -> 运行:超时等待时间到达,线程被自动唤醒并进入就绪状态。

  8. 运行 -> 终止:线程执行完任务或者发生异常导致线程终止。

启动线程方法 start()和 run()区别

     start()和run()是Java中用于启动线程的两种方法。

start()方法用于启动一个新的线程,并在新的线程中执行run()方法。当start()方法被调用时,会创建一个新的线程,并且该线程会执行run()方法中的代码。

run()方法定义了线程的主体,包含了线程要执行的代码。当run()方法被调用时,会在当前线程中执行run()方法中的代码,而不会创建新的线程。

所以,区别在于start()方法会创建一个新的线程,而run()方法只是在当前线程中执行run()方法中的代码。一般情况下,应该使用start()方法来启动线程,这样可以实现多线程并发执行。使用run()方法启动线程,相当于在当前线程中顺序执行run()方法中的代码,不会实现多线程的效果。

线程中的 wait()和 sleep()方法区别

    

wait()方法和sleep()方法都是线程中的方法,但是它们的功能和使用方式有所不同。

  1. wait()方法:
  • wait()方法是Object类中的方法,需要在同步代码块或同步方法中使用。当一个线程调用对象的wait()方法时,该线程会释放对象的锁,并进入等待状态,直到其他线程调用同一个对象的notify()或notifyAll()方法来唤醒等待中的线程。
  • wait()方法的调用可以帮助线程间的协调合作,允许线程之间等待某个条件满足后再继续执行。
  • wait()方法必须在synchronized块中调用,否则会在运行时抛出IllegalMonitorStateException异常。
  1. sleep()方法:
  • sleep()方法是Thread类的静态方法,用于暂停当前线程的执行一段时间,不释放当前线程所持有的锁。
  • sleep()方法的调用不需要在同步代码块或同步方法中,任何地方都可以调用。
  • sleep()方法可以用来模拟线程间的时间间隔,或者在某些需要睡眠一段时间的情况下使用。

多线程同步方法

  1. synchronized关键字:通过在方法或代码块前加上synchronized关键字,可以实现对方法或代码块的同步。一次只能有一个线程访问该同步方法或代码块,其他线程需要等待。 代码示例:
class Counter {private int count;public synchronized void increment() {count++;}
}
  1. Lock接口:Java提供了Lock接口及其实现类ReentrantLock来实现更灵活的同步操作。通过调用lock()方法获得锁,调用unlock()方法释放锁。 代码示例:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class Counter {private int count;private Lock lock;public Counter() {count = 0;lock = new ReentrantLock();}public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}
}

  1. synchronized关键字与wait()、notify()、notifyAll()方法:可以使用synchronized关键字结合wait()、notify()、notifyAll()方法实现线程间的等待和唤醒操作。 代码示例:
class MyThread implements Runnable {private Object lock;public MyThread(Object lock) {this.lock = lock;}@Overridepublic void run() {synchronized (lock) {try {// 线程等待lock.wait();} catch (InterruptedException e) {e.printStackTrace();}// 线程被唤醒后执行的操作}}
}public class Main {public static void main(String[] args) throws InterruptedException {Object lock = new Object();Thread thread = new Thread(new MyThread(lock));thread.start();// 唤醒线程synchronized (lock) {lock.notify();}}
}

总结

   

多线程的状态可以总结为以下几种:

  1. 新建(New):线程被创建但还没有启动。

  2. 就绪(Runnable):线程被调度,并且准备开始执行,但还没有开始执行。

  3. 运行(Running):线程正在执行中。

  4. 阻塞(Blocked):线程因为某种原因被阻塞,例如等待 IO 操作完成或在等待锁释放。

  5. 等待(Waiting):线程被指定等待某个条件满足,例如调用了对象的 wait() 方法。

  6. 超时等待(Timed Waiting):线程被指定等待一段时间,例如调用了 Thread.sleep() 方法或带有超时参数的 wait() 方法。

  7. 终止(Terminated):线程执行完毕或者异常终止。

    

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

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

相关文章

ssm145基于java的电脑硬件库存管理系统+jsp

电脑硬件库存管理系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对电脑硬件库存信息管理混乱&…

SQL 语言:完整性约束

文章目录 概述主键 ( Primary Key ) 约束外键(Foreign Key)约束属性值上的约束全局约束总结 概述 数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据。保证数据库中数据是正确的,…

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式: 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…

通过扩展指令增强基于覆盖引导的模糊测试

本文由Bruno Oliveira于2024年4月25日发表于IncludeSec的官方网站上。作为IncludeSec的安全研究人员,在他们日常的安全审计和渗透测试工作中,有时需要为客户开发一些模糊测试工具。在安全评估方法中使用模糊测试技术,可以有效地在复杂的现代化…

已解决SyntaxError: EOL while scanning string literal 亲测有效!!!

已解决SyntaxError: EOL while scanning string literal 亲测有效!!! 亲测有效 报错问题解决思路解决方法 报错问题 当你在编写Python代码时,可能会遇到以下报错信息: SyntaxError: EOL while scanning string liter…

如何搭建springBoot项目中的全局异常处理和自定义异常处理

目录 1 什么是异常 2 异常的种类 3 解决异常的方式 4 全局异常处理器和自定义异常处理器 5 测试异常处理 1 什么是异常 异常(Exception)是在程序执行过程中出现的一种特殊情况或错误。它可以是由于程序逻辑错误、运行环境问题、用户输入错误等原因…

JUC框架-并发容器源码详解

文章目录 并发容器ConcurrentHashMapJDK 1.7 及之前的实现原理JDK 1.8 及之后的实现原理 CopyOnWriteArrayList & CopyOnWriteArraySet工作原理(附源码)特点适用场景 ConcurrentLinkedQueue数据结构入队列操作ConcurrentLinkedQueue 特性ConcurrentL…

LED屏控制卡是如何控制LED屏的?

LED屏控制卡是LED显示屏的关键组件之一,负责将输入的画面信息转换为LED屏能够显示的数据和控制信号。以下是LED屏控制卡的工作原理和功能的详细介绍: 1. LED显示屏控制器概述: LED显示屏控制器是LED显示屏的核心部件之一,也称为LE…

剪画小程序:自媒体创作的第一步:如何将视频中的文案提取出来?

自媒体创作第一步,文案提取无疑是至关重要的一环。 做自媒体之所以要进行文案提取,有以下重要原因: 首先,提高效率。通过文案提取,可以快速获取关键信息,避免在无关紧要的内容上浪费时间,从而…

685. 冗余连接 II

685. 冗余连接 II 问题描述 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。 输入一个有向图,该…

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

基础—SQL—DML(数据操作语言)插入数据

一、介绍 分类全称说明DMLData Manipulation Language数据操作语言。用来对数据库表中的数据进行增删改(插入、删除、修改) 则增、删、改是三个操作也就对应着三个关键字,分别是: 添加数据:( INSERT )修改数据&#…

远程户外监控组网方案,工业4G路由器ZR2000

户外监控无人值守4G工业路由器组网应用涉及工业自动化、数据传输和远程监控的重要领域。在户外没有光纤的情况下,想要让监控或传感器等设备联网,仅需一台4G工业路由器即可解决。以下是关于远程监控户外组网的详细分析与应用: 物联网应用场景 …

LeetCode115:不同的子序列

题目描述 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 7 取模。 代码 /*dp[i][j]:以i为结尾的s中有以j为尾的t的个数递推公式:当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新闻资讯 的设计与实现

一.项目介绍 本系统分为 后端 和 小程序端 后端:点击登录按钮 设置个人中心、 管理员账号数据维护、 基础数据维护、 短视频信息维护(包括查看短视频留言、短视频收藏)、 论坛维护(增删改查帖子信息,包括查…

uniapp微信小程序的单项选择器大小颜色的修改

问题描述&#xff1a;需要修改radio的大小和颜色&#xff0c;组件官网radio-group | uni-app官网 修改radio颜色 直接使用color属性就行了 eg. <label class"agree_label"><radio class"agree_radio" value"" click"setuserAgr…

蓝桥杯第十四届国赛B组刷题笔记

A-0子2023&#xff1a; 题目&#xff1a; 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; &#x1d446;12345678910111213...20222023S12345678910111213...20222023。 小蓝想知道 &#x1d446;S 中有多少种子序列恰好等…

OneForall工具的下载安装和使用(Windows和Linux)

目录 OneForall的介绍 OneForall的下载 OneForall的安装 安装要求 安装步骤&#xff08;git 版&#xff09; 安装&#xff08;kali&#xff09; OneForall的使用命令 在Windows 在Linux&#xff08;kali&#xff09; OneForall的结果说明 免责声明 本文所提供的文字和…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用户授权管理信息和元数据信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC