IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 并发编程API解析与对比 -> 正文阅读

[Java知识库]并发编程API解析与对比

线程运行状态图解

java:
在这里插入图片描述
linux:
阻塞状态被java细分为了 blocker waiting time_waiting
在这里插入图片描述

需要在synchronized中使用——wait()和notify()

java中当调用一个锁对象的wait或notify方法时,如当前锁的状态是偏向锁或轻量级锁则会先膨胀成重量级锁。

  • JDK在Object对象中提供了2个非常重要的接口线程方法wait方法和notify方法,也就是所有Java对象都有这2个方法。
  • wait()可以设置等待时间也可以不设,这两种情况调用wait()后,线程的状态是不一样的。设置等待时间的情况,调用wait()后,线程状态是TIMED_WAITING,时间到后自动加入EntryList进行BLOCKED。不设等待时间,线程状态是WAITING,此时代码停在wait()的位子,重新获得执行的条件后会从当前位子继续执行。
  • 我们有一个person对象,如果一个线程T1调用person.wait(),那么这个线程T1就会进入person对象的等待队列,线程状态是WAITING,在这个等待队列中可能还有线程T2,线程T3,线程T4。
  • 现在T5线程获取到锁进入同步代码块,此时调用person.notify()方法,它就会从这个等待队列中随机选一个线程,并将其唤醒后加入EntryList进行BLOCKED,在这里这个选择是不公平的,也就是选择线程T1,T2,T3,T4是随机的,当然了也可以调用person,notifyAll()方法,这个方法会把线程T1,T2,T3,T4全部唤醒后加入EntryList进行BLOCKED。
  • 需要注意的是person.wait()方法并不是随便调用的,它必须包含在对应的synchronzied中,无论是wait()方法还是notify()方法都需要首先获取目标对象上的一个监视器。

在这里插入图片描述

wait()与sleep()【不需要前提条件就可以使用】的区别

  • wait()来自Object类,sleep()来自Thread类。
  • 成功调用锁对象的wait方法后,当前线程会释放锁,进入Monitor的WaitSet中。而调用Thread.sleep()是不会释放锁的。
  • sleep(millionseconds)需要指定一个睡眠时间,时间一到会自然唤醒。wait()传入不为0的正整数会在时间到后自动进入阻塞队列等待,wait()则需要配合notify()或者notifyAll()使用。
  • sleep不需要强制和synchronized配合使用,但wait需要。

需要Lock才能使用——await()与signal()

        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();

线程等待让出资源进入条件变量阻塞:持有lock的线程调用await()
线程唤醒:持有lock的线程signal()
唤醒所有线程:持有lock的线程signalAll()

底层调用的是:park unpark

不需要前提条件就可以使用——park()与unpark()

  • park/unpark不需要在同步块或者方法内执行。
  • park/unpark不需要先执行park,在执行unpark,无需在意顺序。
  • 当前线程调用LockSupport.park()方法会让当前线程从 RUNNABLE-----> WAITING
  • 调用LockSupport.unpark(目标线程)或调用了线程的interrupt(),会让目标线程从 WAITING–>RUNNABLE
    在这里插入图片描述
    在这里插入图片描述
    调用park方法

在这里插入图片描述

调用unPark方法
在这里插入图片描述
在这里插入图片描述

interrupt()

当对一个线程,调用 interrupt() 时:

  • ① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。仅此而已。
  • ② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
  • 也就是说,一个线程如果有被中断的需求,那么就可以这样做。
    ① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。
    ② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)
Thread thread = new Thread(() -> {
    while (!Thread.interrupted()) {
        // do more work.
    }
});
thread.start();

// 一段时间以后
thread.interrupt();

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:17:11  更:2022-05-11 16:19:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:55:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码