众所周知java支持多线程,有多线程就必然会存在多线程的交互,交互方式有多种,比如通过共享数据,或者通过提供的锁信号量等等,这里通过用wait以及notify实现线程交互。

要用好线程的wait和notify就要首先了解一下线程的状态,线程的状态大致可以划分为一下几种,创建->就绪->运行->阻塞->销毁

一个线程通过new 到调用start完成了创建到就绪,这个之后就是等待cpu分配资源运行,阻塞的状态是发生在线程运行状态之后,发生线程阻塞的情况有很多种,这里简单的列举一下

1>锁阻塞

2>调用wait阻塞

3>调用join阻塞

4>调用sleep阻塞

当然线程也可以从运行状态返回到就绪状态,这个是通过调用Thread类的yeild方法实现的,这里简单说明一下,wait以及notify和notifyall是在超父类Object中提供的,也就是说属于类的

,而sleep/join/yeild是Thread这个类提供的,也即是属于线程的

从上可知,wait以及notify是只能用在对象锁上,不能和共享锁一起使用即只能和synchroized这个关键之一起使用,也就是说用wait和notify之前,必须先获得对象的锁,当调用wait的时候,

线程被放入对象监视器的等待队列里面,而且会释放锁,等待其他线程调用notify从锁对象监视器的等待队列里,取得一个线程执行,记着,synchronized是对象锁,就是说她要锁整个对象。

通过以上我们大致了解了,wait和notify的知识点,下面请看例子,简单的生产者消费者的例子

1 public classTest {2

3 private static List queue = new ArrayList<>();4

5

6 /**

7 * 生产者8 *@paramn void9 *10 */

11 public synchronized void producer(intn){12 System.out.println("insert data "+n);13 queue.add(n);14

15 if(queue.size()==1)16 this.notify();17 }18

19 /**

20 * 消费者21 *@returnint22 *23 */

24 public synchronized intconsumer(){25 try{26 if(queue.isEmpty())27 this.wait();28 } catch(InterruptedException e) {29 e.printStackTrace();30 }31 int result = queue.get(0);32 queue.remove(0);33 returnresult;34 }35

36 public static voidmain(String[] args) {37 final Test test = newTest();38

39 Thread thread1 = new Thread(new Runnable() {//生产线程

40

41 @Override42 public voidrun() {43 Random random = newRandom();44 try{45 while(true){46 test.producer(random.nextInt(1000));47 Thread.sleep(2000);48 }49 } catch(InterruptedException e) {50 e.printStackTrace();51 }52 }53 });54

55 Thread thread2 = new Thread(new Runnable() {//消费线程

56

57 @Override58 public voidrun() {59 try{60 while(true){61 System.out.println("select data is "+test.consumer());62 Thread.sleep(1000);63 }64 } catch(InterruptedException e) {65 e.printStackTrace();66 }67 }68 });69

70 thread1.start();71 thread2.start();72 }73 }

以上是个人的理解,如有误的地方,欢迎大家批评指正,不胜感激

java 线程交互_java 线程交互之wait/notify相关推荐

  1. java+向前进一_Java 线程基础

    前言 线程并发系列文章: 熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性.操作的原子性,进而扩展出的Volatile.锁(CAS/Synchr ...

  2. java线程触发_java线程

    线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...

  3. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  4. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  5. java中我爱你_Java线程学习(转)

    编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...

  6. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  7. java 线程状态_Java线程为何没有Running状态?我猜你不知道。

    作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...

  8. java线程分类_Java 线程类别

    Java 线程类别 守护线程和非守护线程 守护线程和非守护线程之前的唯一区别在于:是否阻止JVM的正常退出. JVM正常退出是与异常退出相对的概念,异常退出如调用System.exit(status) ...

  9. java runnable 异常_JAVA 线程中的异常捕获

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  10. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

最新文章

  1. Kubernetes基于Metrics Server的HPA
  2. linux发行版本在这里。
  3. C语言鹦鹉学舌1,鹦鹉学舌真是简单的学舌吗?为什么他们清晰的知道在哪用哪些词...
  4. 一生一世高圆圆经典台词
  5. 【机器学习】从电影数据集到推荐系统
  6. HDU 1019 Least Common Multiple
  7. Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】
  8. linux脚本监控某一进程,linux监控某个进程的运行shell脚本
  9. (35)System Verilog类静态变量详解
  10. rpm安装mysql5.6_利用rpm安装mysql 5.6版本详解
  11. MTK如何烧录IMEI码(俗称串号)
  12. 5S管理跟精益生产的关系是什么?如何使5S管理有效落地?
  13. 深度学习之 7 深度前馈网络
  14. 页面静态化的优点及缺点
  15. 【2021四川省赛】E.Don‘t Really Like How The Story Ends 图论
  16. jquery 处理页面的事件详解
  17. Go语言复合数据类型之map
  18. J Infect (IF 38) | 韩国中央大学贾保磊等揭示人口腔微生物组中编码羊毛硫抗生素链球菌是肝脏疾病的潜在风险因子...
  19. 基于FPGA的图像平滑处理
  20. 老铁们来区分函数和宏定义的速度了哈!

热门文章

  1. 「hadoop」hadoop启动需要相关的命令(仅供本人使用)
  2. mysql 匹配 findinset
  3. 区块链学堂:区块链引子
  4. git 覆盖本地修改_Git拉力–如何使用Git覆盖本地更改
  5. github pages_使用GitHub Pages和Lighthouse增强您的开发人员产品组合
  6. 为什么要在JavaScript中使用静态类型? (使用Flow进行静态打字的4部分入门)
  7. autowired java_Java 基础之Autowired 是否是自动注入
  8. aspose.cells 无法读取公式值_隐藏 Excel表格、公式的9种方法
  9. centOS安装Java环境全过程
  10. Java中final关键字如何使用?