Java中什么方法导致线程阻塞

Java中什么方法导致线程阻塞一 为什么引入线程阻塞机制 为了解决对共享存储区的访问冲突 Java 引入了同步机制 现在让我们来考察多个线程对共享资源的访问 显然同步机制已经不够了 因为在任意时刻所要求的资源不一定已经准备好了被访问 反过来 同一时刻准备好了的资源也可能不止一个 为了解决这种情况下的访问控制问题 Java 引入了对阻塞机制的支持 阻塞指的是暂停一个线程的执行以等待某个条件发生 如某资源就绪 学过操作系

一、为什么引入线程阻塞机制?

为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持

阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。

二、Java中实现线程阻塞的方法:

(1)线程睡眠:Thread.sleep (long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

(2)线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait() 一样。wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用.

(3)线程礼让,Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程.

(4)线程自闭,join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

(5)suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。Thread中suspend()和resume()两个方法在JDK1.5中已经废除,不再介绍。因为有死锁倾向

这里,笔者放入一张线程生命周期的经典图片,来帮助读者理解,里面展示了一个线程从创建->运行->阻塞->运行->死亡的全过程:

Java中什么方法导致线程阻塞

三、常用线程名词解释

主线程:JVM调用程序main()所产生的线程。

当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。

后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束

前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。

可见进程:可见进程是指一些不在前台,但用户依然可见的进程,举例来说:各种widget、输入法等,都属于visibe。这部分进程虽然不在前台,但与我们的使用也是密切相关,我们并不希望它被系统终止。

“前台可见进程服务于后台空进程”——这是记录线程重要性的口诀,

重要性一次递减即,前台进程>可见进程>服务进程>后台进程>空进程。

线程类的一些常用方法

sleep(): 强迫一个线程睡眠N毫秒。

isAlive(): 判断一个线程是否存活。

join(): 等待线程终止。

activeCount(): 程序中活跃的线程数。

enumerate(): 枚举程序中的线程。

currentThread(): 得到当前线程。

isDaemon(): 一个线程是否为守护线程。

setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)

setName(): 为线程设置一个名称。

wait(): 强迫一个线程等待。

notify(): 通知一个线程继续运行。

setPriority(): 设置一个线程的优先级。

感兴趣的读者可以参考下笔者的另外一篇文章:

>>>—《Java线程阻塞方法sleep()和wait()精炼详解》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221099.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:55
下一篇 2026年3月17日 下午6:55


相关推荐

  • Spring系列学习之Spring Messaging消息支持

    Spring系列学习之Spring Messaging消息支持英文原文 https docs spring io spring boot docs current reference html boot features messaging html 目录 JMSActiveMQ 支持 Artemis 支持使用 JNDIConnecti 发送消息接收消息 AMQPRabbitMQ 支持发送消息接收消息 Ap

    2026年3月18日
    2
  • 吉利GKUI车机任意安装第三方APP软件教程,DNS劫持应用商店安装软件

    吉利GKUI车机任意安装第三方APP软件教程,DNS劫持应用商店安装软件任意安装你想要的 APP 文中使用的方法为 DNS 劫持车机应用商店 需要你具备一定的操作能力 否则将无法达到最终目的 阅读本文 视为你有一定电脑基础 请不要重复询问无关痛痒的问题 百度就是最好的老师 支持车型 博瑞 GE 全系列 18 款 20 款博越 星越全系列 缤越全系列 缤瑞全系列 嘉际全系列等车型文中使用的 dns 地址为 47 95 115 6 教程所需物料 根据教程来操作 只

    2026年3月20日
    2
  • BP人工神经网络matlab工具箱_matlab神经网络控制

    BP人工神经网络matlab工具箱_matlab神经网络控制自己测试人口预测的matlab实现:x=[54167551965630057482587966026661465628286465365994672076620765859672956917270499725387454276368785348067182992852298717789211908599242093717949749625997542987051000721016541030081…

    2025年9月12日
    5
  • get请求和post请求的区别(全面讲解)

    get请求和post请求的区别(全面讲解)get 和 post 请求区别详解

    2026年3月18日
    3
  • keypad.h arduino按键操作显示

    keypad.h arduino按键操作显示#include<Keypad.h>constbyteROWS=4;//矩阵键盘行数constbyteCOLS=4;//矩阵键盘列数//按键定义charhexaKeys[ROWS][COLS]={{‘0′,’1′,’2′,’3’},{‘4′,’5′,’6′,’7’},{‘8′,’9′,’A’,’B’},{‘…

    2022年5月2日
    135
  • JavaScript数据类型

    JavaScript数据类型与 Java 和其它强数据类型的语言不同 JS 是弱类型语言 只有 5 种简单的数据类型 Undefined 未定义 Null null Boolean 布尔 String 字符串 Number 数字 另外一种复杂的数据类型 Object 对象 nbsp 数组也是 Object 类型 可以使用 typeof 来得到数据类型 例如 var nbsp a abc nbsp nbsp alert

    2026年3月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号