首页 > 编程语言 >Java线程的WAITING状态和BLOCKED状态之间区别的一点理解

Java线程的WAITING状态和BLOCKED状态之间区别的一点理解

时间:2023-06-28 10:13:38浏览次数:43  
标签:Java WAITING 线程 sleep BLOCKED 方法 wait

先说结论:WAITING状态是线程在获取锁对象之后,由于某些原因需要等待一些事件的完成才能继续执行,这时线程调用Object.wait()、Thread.sleep()、Thread.join()等方法进入WAITING状态。而BLOCKED状态则是线程在准备进入某个同步代码块时,发现锁对象已经被其它线程占用了,这时线程就会进入BLOCKED状态。

接下来是一些注意点:

  • wait和notify方法要在同步块中调用(防止wait的线程没有接收到其他线程发送的notify消息),wait会释放锁,但notify方法并不会真正释放锁,必须等到它所在的同步代码块执行完毕才能完成锁对象的释放。

  • sleep方法不必在同步块中调用,而且sleep方法不会释放锁。(个人理解,sleep方法需要时间参数,到达指定时间后线程自动苏醒,所以不需要类似wait那样的严格要求)
  • join方法底层使用wait方法,并且join方法本身就是同步方法(锁对象是调用join方法的线程本身),所以和sleep一样不必在同步块调用,并且jvm在关闭线程之前会检测线阻塞在线程锁对象上的其它线程,然后执行notfyAll(),这样就实现了唤醒阻塞线程的功能 。

标签:Java,WAITING,线程,sleep,BLOCKED,方法,wait
From: https://www.cnblogs.com/rockdow/p/17510629.html

相关文章

  • Java语言学习2
    JavaSE2面向对象(OOP)编程初始面向对象面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么....面向过程适合处理一些简单的问题面向对象思想物以类聚,分类的思维模式,思考问题是否首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对......
  • Java语言学习1
    JavaSE1机器语言的发展史第一代语言(机器语言)机器语言计算机的基本计算方式都是基于二进制的方式。二进制:0101010010110101001这种代码是直接输入给计算机使用的,不经过任何转换101210311410051016110711181000161000032100000第二代机器语言(......
  • Java之thread常用成员
    setName用于自定义线程的名字,方便我们调试定为问题;@TestpublicvoidsetNameTest(){Runnablerun=()->{System.out.println(Thread.currentThread().getName());};vart1=newThread(run);t1.start();......
  • 【后端面经-Java】Synchronize和ReentrantLock区别
    目录1.概念介绍1.1线程安全锁1.2公平锁1.3响应中断/等待可中断2.区别2.1底层实现2.2锁的用法2.3锁的特点2.4性能比较2.5适用场景3.总结比较参考文献1.概念介绍1.1线程安全锁Synchronize(同步锁)和ReentrantLock(可重入锁)都是Java中的常用锁,都是用来保证线程安全的。......
  • 多线程
    并发和并行并行:在同一时刻,有多个指令在多个CPU上同时执行。并发:在同一时刻,有多个指令在单个CPU上交替执行。进程和线程进程:就是操作系统中正在运行的一个应用程序。独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。动态性:进程的实质是程序......
  • 谈一谈进程、线程与协程
    进程、线程、协程概念什么是进程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在Java中,当启动main方法时其实就是启动了一个JVM的进程,而main方法所在的线程就是这个进程中的一个线程,称为主......
  • java反序列化与反序列化
    java反序列化漏洞JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法方法调用了别的方法,最终执行到了例如Transfrom方法的危险方法java序列化过程:调用一个函数进行序列化,存放到一个文件内,再将文件反序列化回来,涉及到文件的读写序列化与反序列化序列化:Objec......
  • 【Java】讲讲StreamAPI
     预设场景:从Mybatis调用Mapper得到的用户集合List<UserDTO>userList=newArrayList<>(); 常用的几种API用法示例:Map方法,转换为某一个字段的集合:List<Integer>userIdList=userList.stream()/*map转换成某个类型来处理,比如这个场景是为了快速......
  • 线程池
    线程池简介线程池是一种基于池化思想的线程管理工具。优点降低资源消耗提高响应速度提高线程的可管理性提供可扩展性使用场景连接池线程隔离开发中需要创建5个以上的线程就可以考虑使用线程池线程池核心参数参数名类型含义corePoolSizeint核心线程数......
  • JavaBlog-3
    前言第三次也是最后博客文章主要是关于java课程第三阶段关于PTA题目集、超星作业以及在实验平台上布置的一些题型。相较于第一、二阶段的作业总结而言此次作业更加针对于总结在面向对象过程中的三大技术特性,即封装性、继承性和多态性,类图的设计更加普遍。在不断深入学习Java......