java线程通讯的方式主要有三种

  1. suspend/resume
  2. wait/notify
  3. park/unpark

suspend/resume

  1. 正常的suspend/resume
public void suspendResumeTest() throws Exception {// public static Object baozidian = null;// 启动线程Thread consumerThread = new Thread(() -> {if (baozidian == null) { // 如果没包子,则进入等待System.out.println("1、进入等待");Thread.currentThread().suspend();}System.out.println("2、买到包子,回家");});consumerThread.start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();consumerThread.resume();System.out.println("3、通知消费者");}
  1. 死锁的suspend/resume: suspend并不会像wait一样释放锁,故此容易写出死锁代码
public void suspendResumeDeadLockTest() throws Exception {// public static Object baozidian = null;// 启动线程Thread consumerThread = new Thread(() -> {if (baozidian == null) { // 如果没包子,则进入等待System.out.println("1、进入等待");// 当前线程拿到锁,然后挂起synchronized (this) {Thread.currentThread().suspend();}}System.out.println("2、买到包子,回家");});consumerThread.start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();// 争取到锁以后,再恢复consumerThreadsynchronized (this) {consumerThread.resume();}System.out.println("3、通知消费者");
}
  1. 导致程序永久挂起的suspend/resume
public void suspendResumeDeadLockTest2() throws Exception {// public static Object baozidian = null;// 启动线程Thread consumerThread = new Thread(() -> {if (baozidian == null) {System.out.println("1、没包子,进入等待");try { // 为这个线程加上一点延时Thread.sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}// 这里的挂起执行在resume后面Thread.currentThread().suspend();}System.out.println("2、买到包子,回家");});consumerThread.start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();consumerThread.resume();System.out.println("3、通知消费者");consumerThread.join();
}

wait/notify

  1. 正常的wait/notify
public void waitNotifyTest() throws Exception {// public static Object baozidian = null;// 启动线程new Thread(() -> {if (baozidian == null) { // 如果没包子,则进入等待synchronized (this) {try {System.out.println("1、进入等待");this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println("2、买到包子,回家");}).start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();synchronized (this) {this.notifyAll();System.out.println("3、通知消费者");}
}
  1. 会导致程序永久等待的wait/notify
public void waitNotifyDeadLockTest() throws Exception {// public static Object baozidian = null;// 启动线程new Thread(() -> {if (baozidian == null) { // 如果没包子,则进入等待try {Thread.sleep(5000L);} catch (InterruptedException e1) {e1.printStackTrace();}synchronized (this) {try {System.out.println("1、进入等待");this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println("2、买到包子,回家");}).start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();synchronized (this) {this.notifyAll();System.out.println("3、通知消费者");}
}

park/unpark

  1. 正常的park/unpark
public void parkUnParkTest() throws Exception {// public static Object baozidian = null;// 启动线程Thread consumerThread = new Thread(() -> {if (baozidian == null) { // 如果没包子,则进入等待System.out.println("1、进入等待");LockSupport.park();}System.out.println("2、买到包子,回家");});consumerThread.start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();LockSupport.unpark(consumerThread);System.out.println("3、通知消费者");
}
  1. 死锁的park/unpark
public void parkUnParkDeadLockTest() throws Exception {// public static Object baozidian = null;// 启动线程Thread consumerThread = new Thread(() -> {if (baozidian == null) { // 如果没包子,则进入等待System.out.println("1、进入等待");// 当前线程拿到锁,然后挂起synchronized (this) {LockSupport.park();}}System.out.println("2、买到包子,回家");});consumerThread.start();// 3秒之后,生产一个包子Thread.sleep(3000L);baozidian = new Object();// 争取到锁以后,再恢复consumerThreadsynchronized (this) {LockSupport.unpark(consumerThread);}System.out.println("3、通知消费者");
}

总结

  1. suspend/resume对调用顺序有要求,也要开发自己注意锁的释放。这个被弃用的API, 容易死锁,也容易导致永久挂起。
  2. wait/notify要求再同步关键字里面使用,免去了死锁的困扰,但是一定要先调用wait,再调用notify,否则永久等待了
  3. park/unpark没有顺序要求,但是park并不会释放锁,所以在同步代码中使用要特别注意,防止出现死锁

java线程通讯的方式相关推荐

  1. java 线程通讯_java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  2. java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  3. java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  4. 关于Java线程通讯的学习日志

    Java中线程通讯 主要涉及对并发线程的操控 1.利用synchronized进行对象锁定实现对线程的控制 2.使用lock condition进行线程控制 3.使用管道(Piped)Stream 为 ...

  5. Java 线程的终止方式

    线程的终止JDK中提供了stop()[不建议使用] 和 interrupt()两种方式,同时抛出一个未实现的destroy()[不能使用]方法,目前stop已经被废弃了,因为stop是暴力停止会存在安 ...

  6. Java线程的创建方式

    文章目录 创建线程的几种方法: ①继承Thread类 ②实现Rullable接口 ③实现Callable接口 Callable接口 Future 接口 FutureTask类 ④使用线程池 Runab ...

  7. 快点来学吧!java保证线程安全的方式

    JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...

  8. java线程同步的实现方式

    这里抛砖引玉,为何要使用同步? 当多个线程同时操作一个可共享的资源时会出现线程安全问题,将会导致数据不一致,因此使用同步锁来防止该操作执行完之前不许被其他线程执行,从而保证了该变量的唯一性和准确性.下 ...

  9. 并发编程之深入理解java线程

    并发编程之深入理解java线程 一.线程基础知识 1.1 进程和线程 1.1.1 进程 1.1.2 线程 1.1.3 进程与线程的区别 1.1.4 进程间通信的方式 1.2 线程的同步互斥 1.3 上 ...

最新文章

  1. 完美的优化目标,人工智能的盲点
  2. 一般项目中是如何调bug的 ------- 手把手带你体验整个流程
  3. 【BIOS大全】释义+设置+精解+释疑————玩转电脑必备工具帖(8)
  4. Linux打开浏览器进程,Linux终端Web浏览器w3m
  5. Uva 11400,照明系统设计
  6. markdown与latex:像小学生一样写乘X号\times
  7. 永磁同步电机转子磁链_采用冻结磁导率的瞬态场永磁同步电机交直轴电感计算...
  8. 【java与移动智能设备】布局方式
  9. 计算机毕业设计Java安路友汽车租赁(源码+系统+mysql数据库+lw文档
  10. GBase数据库产品介绍
  11. 数字图像处理与应用——图像滤波技术
  12. 《批判性思维》感1.1-[信念执念断言]
  13. SL8100 3.6V~100V降压型大功率LED恒流驱动器
  14. 打开新材料世界的大门:拓扑电子材料目录问世
  15. java获取北京时间系统时间全球各地时间。
  16. linux下文件损坏怎么删除 No such file or directory
  17. FreeSwitch接通30s就挂断
  18. 雨林木风 Ghost XP SP2 精简版 Y2.0
  19. Message创建方式:new Message和obtainMessage的区别
  20. JavaWeb防止表单重复提交

热门文章

  1. “有 些 事 当 了 程 序 员 才 懂”
  2. 查找CSDN误删除博客方法
  3. mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践
  4. 怎么把字符串变成数组_Java中字符串split() 的使用方法,没你想的那么简单
  5. 用PHP控制您的浏览器cache
  6. 《王者荣耀》回应故障:3个工作日内补发排位赛星积分丢失
  7. 华为Mate 50系列明年初发布:麒麟990/骁龙8 Gen1加持
  8. 特斯拉Model Y Performance高性能版车型价格上调一万元
  9. 8599元起!三星Galaxy Z Fold3/Flip3 5G折叠手机国行即将发货
  10. 台积电对世界最大创新贡献是什么?总裁魏哲家这样说...