wait和notify
一.wait和notify
wait是让线程进入等待状态
notify是随即唤醒一个等待中的线程并释放锁(在执行完整个同步代码块后)
notifyAll是唤醒所有等待的线程
example:
开启两个线程A和B 先打印五遍线程B再打印五遍线程A
- class ABRunnable implements Runnable {
- //声明一个标记来解决A先进来的问题
- private boolean flag = false;
- // 声明一把锁
- private Object object = new Object();
- @Override
- public void run() {
- // 循环打印AB 并打印线程名字
- String name = Thread.currentThread().getName();
- System.out.println(name + "进来了");
- //加同步锁
- //运行结果很随机 有时会卡住
- //A先进来会卡住 B先进来运行正确
- synchronized (object) {
- if (name.equals("线程B") && !flag) {
- //进入等待
- try {
- //如果B线程等待时 还拿着锁的话 会有什么现象
- //当线程进入等待的时候会释放锁
- //在哪个位置等待的 就从哪个位置被唤醒
- object.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- for (int i = 0; i < 5; i++) {
- System.out.println(name);
- }
- }
- for (int i = 0; i < 5; i++) {
- System.out.println(name);
- }
- //如果线程A打印完了 线程B就不需要再等待了 直接打印就行
- if (name.equals("线程A")) {
- flag = true;
- }
- object.notify();
- }
- }
- }
创建线程并开启
- public static void main(String[] args) {
- ABRunnable runnable = new ABRunnable();
- Thread t1 = new Thread(runnable, "线程A");
- Thread t2 = new Thread(runnable, "线程B");
- t1.start();
- t2.start();
- }
单例饿汉式:如何保证多个线程调用时的安全性以及如何提高效率
- class HungryMan {
- // 延迟加载(等调用方法的时候在创建对象)
- private static HungryMan hungryMan = null;
- // 私有化构造方法(不让外界创建对象 对象由自己创建)
- private HungryMan() {
- // TODO Auto-generated constructor stub
- }
- public static HungryMan getInstance() {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 在多线程程序中 这个单例安全吗 为什么
- // 例如多个线程 调用该方法
- // 加锁来保证同一时间只有一个线程来创建对象
- //提高效率
- if (hungryMan == null) {
- synchronized (HungryMan.class) {
- hungryMan = new HungryMan();
- }
- }
- return hungryMan;
- }
- }
- class HungryRunnable implements Runnable{
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while (true) {
- HungryMan hungryMan = HungryMan.getInstance();
- System.out.println(hungryMan);
- }
- }
- }
join方法: 哪个线程调用了这个方法 就会拿到CPU的执行权 先完成执行
setDeamon: (守护线程)该方法必须在线程启动前调用 在主线程结束时结束
(并不是立即结束 需要一个缓冲时间)
example:
开启子线程循环打印十次 主线程循环打印十次 先打印子线程再打印主线程
- class SonRunnable implements Runnable{
- @Override
- public void run() {
- for (int i = 0; i < 10; i++) {
- System.out.println(Thread.currentThread().getName());
- }
- }
- }class TestRunnable implements Runnable{
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while (true) {
- System.out.println("测试");
- }
主线程:
- public static void main(String[] args) {
- TestRunnable testRunnable = new TestRunnable();
- Thread t2 = new Thread(testRunnable);
- //该方法必须在线程启动前调用
- t2.setDaemon(true);
- t2.start();
- SonRunnable sr = new SonRunnable();
- Thread t1 = new Thread(sr);
- t1.start();
- //哪个线程调用了这个方法 就会拿到CPU的执行权
- //先完成执行
- try {
- t1.join();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- for (int i = 0; i <www.leyouzaixian2.com 10; i++) {
- System.out.println(Thread.currentThread().getName());
- }
- System.out.println("主线程结束了");
- }
二.接口回调
写法:
1.创建一个接口
2.写一个功能类(打印字符串的方法的参数 可以使用借口来接收 达到调用接口中方法的目的)
3.写实现类
example:
键盘输入1或2 输入1的时候打印红色的字 输入2的时候打印黑色的字
System.err.println("哈哈"); 打印的是红色的
System.out.println("呵呵"); 打印的是黑色的
创建接口:
- //接口
- interface PrintInter{
- //打印方法
- public abstract void print(String string);
- }
- class PrintClass{
- //打印方法(接收接口的参数)
- public static void www.hjha178.com/ printString(PrintInter inter) {
- //调用接口中的方法
- inter.print("接口回调");
- }
- }
写实现类:
- class PrintRed implements PrintInter{
- @Override
- public void print(String string) {
- System.err.println(string);
- }
- }
- class PrintBlack implements PrintInter{
- @Override
- public void print(String string) {
- System.out.println(string);
- }
- }
或者直接在main函数中写匿名内部类:
- public static void main(String[] args) www.chuangshi88.cn/{
- System.out.println("请输入 1 或 2 ");
- Scanner scanner = new Scanner(System.in);
- String string = scanner.nextLine();
- PrintInter inter = null;
- if (string.equals("www.douniu1956.com/1")) {
- PrintClass.printString(new PrintInter() {
- @Override
- public void print(String string) {
- System.err.println(string);
- }
- });
- }else {
- PrintClass.printString(new PrintInter() {
- @Override
- public void print(String www.yongshiyule178.com string) {
- System.out.println(string);
- }
- });
- }
- //调用功能类方法
- PrintClass.printString(inter);
- }
wait和notify相关推荐
- 用实例揭示notify()和notifyAll()的本质区别
用实例揭示notify()和notifyAll()的本质区别 收藏 notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notifyA ...
- java notify 的作用_java 为什么notify和notifyAll都不起作用?
叮当猫咪 每个线程初始化的时候都是 c=new C(),锁住的是不同的对象.class Example{ public static void main(String arr[]){ ...
- lua java 性能比较_Lua coroutine vs Java wait/notify
在上文Lua coroutine 不一样的多线程编程思路中想到coroutine的运行机制跟Java中的wait/notify很相似,所以写了一个简单程序比较一下. 源代码 Lua code co = ...
- java wait abc_java----wait/notify
解释 wait/notify必须配合synchronized使用 demo class NotifyStop2 { private final Object lock = new Object(); ...
- JAVA多线程之Synchronized、wait、notify实例讲解
一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...
- java 线程交互_java 线程交互之wait/notify
众所周知java支持多线程,有多线程就必然会存在多线程的交互,交互方式有多种,比如通过共享数据,或者通过提供的锁信号量等等,这里通过用wait以及notify实现线程交互. 要用好线程的wait和no ...
- 解决THINKPHP 支付宝接口异步notify 无效可能的问题。
2019独角兽企业重金招聘Python工程师标准>>> 支付成功后,发现alipayReturn 正常~ AlipayNotify 怎么搞都不正常,好像支付宝就是不能POST过来. ...
- java线程wait_java多线程学习(四) 之 wait和notify
ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...
- java线程-保护性暂停(wait,notify实现)
考虑以下场景需求: A同学计算一个结果res B同学需要等待A同学的结果res 需要用到保护性暂停:一个线程等待另外一个线程的执行结果 这里我们让A,B同学关联到一个类. B同学一直等待A同学 imp ...
- Java中的等待/通知机制(wait/notify)
为什么80%的码农都做不了架构师?>>> 当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...
最新文章
- 超时时间已到。在操作完成之前超时时间已过或服务器未响应
- android点滴13:Eclipse连接不上模拟器(一片空白,无报错)
- 《漫画算法2》源码整理-7 第K大的数字
- 中单引号和双引号的区别与联系_VB中Sub与function的联系与区别
- 数据表现层文件命名参考
- view.post(Runnable)
- kotlin教程(1)
- Java之super
- Java线程池 - 问题驱动学习
- RAC-DG 安装总结
- 马云入选全球“十大思想者”,成唯一获选的中国企业家
- .net2.0中对config文件的操作方法总结
- 当局为器,人民为水。当局什么样,人民就什么样
- 计算机一级考试评分规则标准,CAD考试规则评分标准
- mysql varchar 不设长度_Mysql varchar长度问题
- ch341a i2c 安卓_CH341A安卓平板OTG连接成功但读取不到数据
- intel RealSense摄像头比较
- 计讯物联环保数采仪全系列产品为节能降耗减碳贡献绿色力量
- 【一周头条盘点】中国软件网(2018.5.7~2018.5.11)
- 《深入理解Android 卷Ⅰ》深入理解init
热门文章
- @scheduled cron启动后和每小时执行_小耶哥: 一个Redis分布式锁又要和小鑫同学扯半个小时!...
- python socket 通信
- sklearn中的cross_val_score交叉验证
- 视频目标检测跟踪--Detect to Track and Track to Detect
- 目标检测--Beyond Skip Connections: Top-Down Modulation for Object Detection
- java 自动登录功能_jsp实现用户自动登录功能
- Linux中的无人职守安装脚本kickstart
- php消除连续字符,JS字符串去除连续或全部重复字符的实例
- java如何调用thrift_java – 我想在一个传输上使用多个服务(Thrift)
- Java线程池中submit()和execute()方法有什么区别