大纲:java线程知识体系

一、sleep与wait的区别,先举例,再理论!
公厕(公厕的坑位是共享资源)中无论多少人(人是线程)排队,只要你锁好厕门(synchronized)就不会出现线程安全问题,无论排队的多么着急都要一个个来,锁门期间(同步代码块内/同步方法内)调用sleep相当于你蹲坑期间睡着了,那么门锁(同步锁)肯定不会自动打开,依然是锁着的,除非时间到了你睡醒了然后该干嘛干嘛,否则只能通过粗暴的方式先把你叫醒(interreput方法)再说。wait相当于你礼让他人,先主动打开门锁(wait调用后会释放同步锁)让出坑位给别人,然后主动去加入排队蹲坑的大部队中边睡觉(进程陷入阻塞态)边等待。

二 、notify和notifyAll()
如果有人上完厕所,出来后看到睡眠中的排队者们,可以通过只叫醒一个(notify,使进程由阻塞态 => 就绪态),但叫醒的一定是憋的最着急的人(优先级最高的线程),被叫醒的人能立刻获得坑位资源。另外,也可以选择一次性唤醒所有(notifyAll)排队者,这时排队者会一窝蜂涌入争夺坑位,可无论多么激烈,只能有一个人抢占坑位,优先级越高的线程抢到茅坑资源的概率越大

sleep和wait都是用来进行线程控制,都可以使线程阻塞
1 sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()/notifyAll()直接唤起.
2. sleep是Thread类的静态方法。 sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程 ; wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者
3. sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,wait()是由某个确定的对象来调用的。

sleep和wait的区别有:
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

经典案例,交替打印0~9

public class Accounter implements Runnable{private int index;@Overridepublic void run() {String name = Thread.currentThread().getName();synchronized (this){while (index < 10){notify();System.out.println(name + "打印:" + index);index++;try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {Accounter accounter = new Accounter();Thread thread = new Thread(accounter);Thread thread2 = new Thread(accounter);thread.start();thread2.start();}
}

推荐学习:消费者生产者案例

java多线程通信基础(面向厕所编程)相关推荐

  1. Java 中的面向数据编程

    近年来, Amber项目为 Java 带来了许多新特性-- 局部变量类型推断. 文本块. 记录类. 封印类. 模式匹配 等等.虽然这些特性都是独立的,但也可以组合在一起使用.具体地说,记录类.封印类和 ...

  2. Java中的面向接口编程

    面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...

  3. Java中的面向切面编程(AOP)

    一.什么是AOP? Aspect Oriented Programming ,即面向切面编程. AOP是对面向对象编程的一个补充. 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中 ...

  4. java多线程的安全问题与死锁(面向厕所编程)

    大纲:java线程知识体系 这是不安全的问题代码 /* Windows模拟的是售票窗口类 共享数据:多个线程共同操作的数据,即本案例中的tocketNum*/ public class Windows ...

  5. JAVA 多线程、CompleableFuture异步编程

    初始化线程的四种办法 继承Thread类 实现Rannable 接口 实现callable 接口 + FutureTask (可以获取处理结果和处理异常) 线程池 继承Thread实现 public ...

  6. java 多线程 任务队列_Java并发编程线程池任务队列

    类ThreadPoolExecutor最常使用的构造方法是: ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliv ...

  7. Java多线程并发编程知识体系(附大图-持续更新)

    Java多线程体系 1.并发编程的优势 提升CPU资源利用率 提升吞吐量 提升程序响应速度 更好的编程模型 2.并发带来的问题 1.安全性问题 0.定义:什么是安全性问题 多线程读写共享变量时出现不正 ...

  8. java基础提升篇:深入浅出Java多线程

    初遇 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程 ...

  9. 深入浅出Java多线程

    初遇 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程 ...

最新文章

  1. python统计列表内元素个数
  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY9-聚类
  3. 在visual studio code中配置python以及解决中文乱码问题
  4. hoj2434 going to know him
  5. 教育部:浙江大学等35所高校新增人工智能本科专业
  6. 迷茫中,请指教,谢谢!
  7. 利用masm32输出PE文件头的基本属性
  8. 华为发布鸿蒙Beta版公测,华为推出鸿蒙OS 2.0手机开发者Beta版:P40、Mate 30系列可申请公测...
  9. 移位和循环移位指令 shl, shr sal, sar, sol, sor, scl, scr, shld, shrd
  10. 支持国产自主可控OS——信创服务器操作系统的配置与管理 (统信UOS版)-新书发布
  11. 【设计】1359- Umi3 如何实现插件化架构
  12. 索尼6400夜景测试 镜头索尼18-55
  13. 鲁大师最新电脑处理器排行,AMD依旧无敌,intel 12代酷睿抢占市场
  14. Java公式编辑器开发思路,附项目源码
  15. 【原创】Windows Docker 设置阿里云镜像加速
  16. 关于φ与Φ函数与序列中分数个数的讨论
  17. 马士兵 oracle seton,马士兵Oracle 下
  18. html的英文全称怎么读,HTML标签英文全称对照.doc
  19. 老师计算机组合照说说,有关于老师的说说句子
  20. (4.6.30)组件化:Android项目构架演变之路

热门文章

  1. [蓝桥杯历届试题] 国庆星期日
  2. SSH连接慢与反向解析(转)
  3. 利用预渲染加速iOS设备的图像显示
  4. C# BackgroudWorker
  5. OLE DB , ODBC , ADO 知识了解
  6. C++之 字符串拷贝函数(面试题目)
  7. C++头文件和源文件,编译过程
  8. java createcriteria_Hibernate createCriteria查询详解
  9. python语言中list和tuple有什么区别_python之list与tuple的区别
  10. c#参数修饰符-params