多线程基本常识

多线程的状态

    在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.rhkb.cn/news/333765.html

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

相关文章

满帮集团 Eureka 和 ZooKeeper 的上云实践

作者:胡安祥 满帮集团,作为“互联网物流”的平台型企业,一端承接托运人运货需求,另一端对接货车司机,提升货运物流效率。2021 年美股上市,成为数字货运平台上市第一股。根据公司年报,2021 年&a…

C++ (week5):Linux系统编程3:线程

文章目录 三、线程1.线程的基本概念①线程相关概念②我的理解 2.线程的基本操作 (API)(1)获取线程的标识:pthread_self(2)创建线程:pthread_create()(3)终止线程①pthread_exit():当前线程终止,子线程主动退出②pthread_cancel()&…

深入解析BGP:互联网路由协议的全貌与应用

BGP(Border Gateway Protocol)是互联网上用于在自治系统(AS)之间交换路由信息的协议。它负责决定数据包的最佳路径以及路由的选择。以下是BGP的一些关键特点和工作原理的详细内容: BGP的特点: 1.路径矢量型…

Android开发 -- JNI开发

1.配置JNI环境 创建JNI文件夹 在项目的主目录中创建一个名为 JNI 的文件夹。这个文件夹将包含所有的本地源代码和配置文件。 编写Android.mk文件 这个文件是一个 Makefile,用来指导 NDK 如何编译和构建本地代码。 #清除之前定义的变量,确保每个模块的…

《python编程从入门到实践》day40

# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug: The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …

运维笔记.Docker镜像分层原理

运维专题 Docker镜像原理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/artic…

探讨大米自动化生产线包装设备的智能化发展趋势

随着科技的飞速发展,智能化已经成为各行各业转型升级的重要方向。在大米生产领域,自动化生产线包装设备的智能化发展更是引领着粮食产业的未来潮流。星派将从智能化技术、市场需求、发展趋势等方面,探讨大米自动化生产线包装设备的智能化发展…

java图书电子商务网站的设计与实现源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书电子商务网站的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 图书电子商…

鸿蒙ArkTS声明式开发:跨平台支持列表【按键事件】

按键事件 按键事件指组件与键盘、遥控器等按键设备交互时触发的事件,适用于所有可获焦组件,例如Button。对于Text,Image等默认不可获焦的组件,可以设置focusable属性为true后使用按键事件。 说明: 开发前请熟悉鸿蒙开…

嵌入式进阶——外部中断(EXTI)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 STC8H中断外部中断外部中断编写配置外部中断调用中断触发函数 外部中断测试测试外部中断0测试外部中断2、3或者4 PCB中断设计 STC8…

echarts取消纵坐标,自定义提示内容,完整 echarts 布局代码

效果图 实现代码 开启点击柱子时的提示内容 //完整写法请看下面tooltip: {trigger: axis,axisPointer: {type: shadow}},自定义提示内容 //完整写法请看下面formatter: function (param) {// param是悬浮窗所在的数据(x、y轴数据)let relVal "&…

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT,并解决不能敲Tab问题 eNSP导入CRT打开eNSP,新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options(选项)-- Global Options (全局选项&#…

LangChain技术解密:构建大模型应用的全景指南

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

vue3父组件改变 子组件不改变(uniapp)

项目中遇到了这么个问题 场景:封装select组件,通过子组件选中后传递值给父组件,父组件需要回显这个值(这里使用 defineProps和defineEmits就可以实现,或者直接使用defineModel也可以实现,但是uniapp目前不…

学习编程对英语要求高吗?

学习编程并不一定需要高深的英语水平。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 虽然一些编程资源和文档可能…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞,这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说,开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…

一键批量整理神器:轻松将相同名称文件归类至指定文件夹,告别繁琐文件管理!

信息爆炸的时代,电脑中的文件数量如潮水般涌现,管理起来令人头疼不已。您是否曾因为文件命名不规范而耗费大量时间寻找某个重要资料?是否曾因为文件散落各处而影响了工作效率?现在,我们为您隆重推荐一款文件管理神器—…

APM2.8如何供电

APM2.8飞控供电有两种, 1.电流计供电, 2.带BEC(稳压功能)的电调供电 飞控有一个JP1,它是一个供电选择接口,当插入跳线帽时,飞控用带BEC电调供电,当不插入时,用电流计供…

英语新概念2-回译法-lesson16

第一次回译 if you ___ your car on a wrong place, the traffic police man will find you quickly. If he do not give you the ticket,you are lucky.However,the ___ not all like this,The police man is __ sometimes.I had a holiday in Sweden, I found a ___ in my c…