一.wait和notify

wait是让线程进入等待状态

notify是随即唤醒一个等待中的线程并释放锁(在执行完整个同步代码块后)

notifyAll是唤醒所有等待的线程

example:

开启两个线程A和B 先打印五遍线程B再打印五遍线程A

[java] view plaincopy
  1. class ABRunnable implements Runnable {
  2. //声明一个标记来解决A先进来的问题
  3. private boolean flag = false;
  4. // 声明一把锁
  5. private Object object = new Object();
  6. @Override
  7. public void run() {
  8. // 循环打印AB 并打印线程名字
  9. String name = Thread.currentThread().getName();
  10. System.out.println(name + "进来了");
  11. //加同步锁
  12. //运行结果很随机 有时会卡住
  13. //A先进来会卡住 B先进来运行正确
  14. synchronized (object) {
  15. if (name.equals("线程B") && !flag) {
  16. //进入等待
  17. try {
  18. //如果B线程等待时 还拿着锁的话 会有什么现象
  19. //当线程进入等待的时候会释放锁
  20. //在哪个位置等待的 就从哪个位置被唤醒
  21. object.wait();
  22. } catch (InterruptedException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. for (int i = 0; i < 5; i++) {
  27. System.out.println(name);
  28. }
  29. }
  30. for (int i = 0; i < 5; i++) {
  31. System.out.println(name);
  32. }
  33. //如果线程A打印完了 线程B就不需要再等待了 直接打印就行
  34. if (name.equals("线程A")) {
  35. flag = true;
  36. }
  37. object.notify();
  38. }
  39. }
  40. }

创建线程并开启

[java] view plaincopy
  1. public static void main(String[] args) {
  2. ABRunnable runnable = new ABRunnable();
  3. Thread t1 = new Thread(runnable, "线程A");
  4. Thread t2 = new Thread(runnable, "线程B");
  5. t1.start();
  6. t2.start();
  7. }

单例饿汉式:如何保证多个线程调用时的安全性以及如何提高效率

[java] view plaincopy
  1. class HungryMan {
  2. // 延迟加载(等调用方法的时候在创建对象)
  3. private static HungryMan hungryMan = null;
  4. // 私有化构造方法(不让外界创建对象 对象由自己创建)
  5. private HungryMan() {
  6. // TODO Auto-generated constructor stub
  7. }
  8. public static HungryMan getInstance() {
  9. try {
  10. Thread.sleep(1000);
  11. } catch (InterruptedException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. }
  15. // 在多线程程序中 这个单例安全吗 为什么
  16. // 例如多个线程 调用该方法
  17. // 加锁来保证同一时间只有一个线程来创建对象
  18. //提高效率
  19. if (hungryMan == null) {
  20. synchronized (HungryMan.class) {
  21. hungryMan = new HungryMan();
  22. }
  23. }
  24. return hungryMan;
  25. }
  26. }
  27. class HungryRunnable implements Runnable{
  28. @Override
  29. public void run() {
  30. // TODO Auto-generated method stub
  31. while (true) {
  32. HungryMan hungryMan = HungryMan.getInstance();
  33. System.out.println(hungryMan);
  34. }
  35. }
  36. }

join方法:  哪个线程调用了这个方法 就会拿到CPU的执行权 先完成执行

setDeamon: (守护线程)该方法必须在线程启动前调用 在主线程结束时结束

(并不是立即结束 需要一个缓冲时间)

example:

开启子线程循环打印十次 主线程循环打印十次 先打印子线程再打印主线程

[java] view plaincopy
  1. class SonRunnable implements Runnable{
  2. @Override
  3. public void run() {
  4. for (int i = 0; i < 10; i++) {
  5. System.out.println(Thread.currentThread().getName());
  6. }
  7. }
  8. }class TestRunnable implements Runnable{
  9. @Override
  10. public void run() {
  11. // TODO Auto-generated method stub
  12. while (true) {
  13. System.out.println("测试");
  14. }

主线程:

[java] view plaincopy
  1. public static void main(String[] args) {
  2. TestRunnable testRunnable = new TestRunnable();
  3. Thread t2 = new Thread(testRunnable);
  4. //该方法必须在线程启动前调用
  5. t2.setDaemon(true);
  6. t2.start();
  7. SonRunnable sr = new SonRunnable();
  8. Thread t1 = new Thread(sr);
  9. t1.start();
  10. //哪个线程调用了这个方法 就会拿到CPU的执行权
  11. //先完成执行
  12. try {
  13. t1.join();
  14. } catch (InterruptedException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. for (int i = 0; i <www.leyouzaixian2.com 10; i++) {
  19. System.out.println(Thread.currentThread().getName());
  20. }
  21. System.out.println("主线程结束了");
  22. }

二.接口回调

写法:

1.创建一个接口

2.写一个功能类(打印字符串的方法的参数 可以使用借口来接收 达到调用接口中方法的目的)

3.写实现类

example:

键盘输入1或2 输入1的时候打印红色的字 输入2的时候打印黑色的字

System.err.println("哈哈"); 打印的是红色的

System.out.println("呵呵"); 打印的是黑色的

创建接口:

[java] view plaincopy
  1. //接口
  2. interface PrintInter{
  3. //打印方法
  4. public abstract void print(String string);
  5. }
  6. class PrintClass{
  7. //打印方法(接收接口的参数)
  8. public static void www.hjha178.com/ printString(PrintInter inter) {
  9. //调用接口中的方法
  10. inter.print("接口回调");
  11. }
  12. }

写实现类:

[java] view plaincopy
  1. class PrintRed implements PrintInter{
  2. @Override
  3. public void print(String string) {
  4. System.err.println(string);
  5. }
  6. }
  7. class PrintBlack implements PrintInter{
  8. @Override
  9. public void print(String string) {
  10. System.out.println(string);
  11. }
  12. }

或者直接在main函数中写匿名内部类:

[java] view plaincopy
  1. public static void main(String[] args) www.chuangshi88.cn/{
  2. System.out.println("请输入 1 或 2 ");
  3. Scanner scanner = new Scanner(System.in);
  4. String string = scanner.nextLine();
  5. PrintInter inter = null;
  6. if (string.equals("www.douniu1956.com/1")) {
  7. PrintClass.printString(new PrintInter() {
  8. @Override
  9. public void print(String string) {
  10. System.err.println(string);
  11. }
  12. });
  13. }else {
  14. PrintClass.printString(new PrintInter() {
  15. @Override
  16. public void print(String www.yongshiyule178.com string) {
  17. System.out.println(string);
  18. }
  19. });
  20. }
  21. //调用功能类方法
  22. PrintClass.printString(inter);
  23. }

wait和notify相关推荐

  1. 用实例揭示notify()和notifyAll()的本质区别

    用实例揭示notify()和notifyAll()的本质区别 收藏 notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notifyA ...

  2. java notify 的作用_java 为什么notify和notifyAll都不起作用?

    叮当猫咪 每个线程初始化的时候都是 c=new C(),锁住的是不同的对象.class Example{    public static void main(String arr[]){      ...

  3. lua java 性能比较_Lua coroutine vs Java wait/notify

    在上文Lua coroutine 不一样的多线程编程思路中想到coroutine的运行机制跟Java中的wait/notify很相似,所以写了一个简单程序比较一下. 源代码 Lua code co = ...

  4. java wait abc_java----wait/notify

    解释 wait/notify必须配合synchronized使用 demo class NotifyStop2 { private final Object lock = new Object(); ...

  5. JAVA多线程之Synchronized、wait、notify实例讲解

    一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...

  6. java 线程交互_java 线程交互之wait/notify

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

  7. 解决THINKPHP 支付宝接口异步notify 无效可能的问题。

    2019独角兽企业重金招聘Python工程师标准>>> 支付成功后,发现alipayReturn 正常~ AlipayNotify 怎么搞都不正常,好像支付宝就是不能POST过来. ...

  8. java线程wait_java多线程学习(四) 之 wait和notify

    ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...

  9. java线程-保护性暂停(wait,notify实现)

    考虑以下场景需求: A同学计算一个结果res B同学需要等待A同学的结果res 需要用到保护性暂停:一个线程等待另外一个线程的执行结果 这里我们让A,B同学关联到一个类. B同学一直等待A同学 imp ...

  10. Java中的等待/通知机制(wait/notify)

    为什么80%的码农都做不了架构师?>>>    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...

最新文章

  1. 超时时间已到。在操作完成之前超时时间已过或服务器未响应
  2. android点滴13:Eclipse连接不上模拟器(一片空白,无报错)
  3. 《漫画算法2》源码整理-7 第K大的数字
  4. 中单引号和双引号的区别与联系_VB中Sub与function的联系与区别
  5. 数据表现层文件命名参考
  6. view.post(Runnable)
  7. kotlin教程(1)
  8. Java之super
  9. Java线程池 - 问题驱动学习
  10. RAC-DG 安装总结
  11. 马云入选全球“十大思想者”,成唯一获选的中国企业家
  12. .net2.0中对config文件的操作方法总结
  13. 当局为器,人民为水。当局什么样,人民就什么样
  14. 计算机一级考试评分规则标准,CAD考试规则评分标准
  15. mysql varchar 不设长度_Mysql varchar长度问题
  16. ch341a i2c 安卓_CH341A安卓平板OTG连接成功但读取不到数据
  17. intel RealSense摄像头比较
  18. 计讯物联环保数采仪全系列产品为节能降耗减碳贡献绿色力量
  19. 【一周头条盘点】中国软件网(2018.5.7~2018.5.11)
  20. 《深入理解Android 卷Ⅰ》深入理解init

热门文章

  1. @scheduled cron启动后和每小时执行_小耶哥: 一个Redis分布式锁又要和小鑫同学扯半个小时!...
  2. python socket 通信
  3. sklearn中的cross_val_score交叉验证
  4. 视频目标检测跟踪--Detect to Track and Track to Detect
  5. 目标检测--Beyond Skip Connections: Top-Down Modulation for Object Detection
  6. java 自动登录功能_jsp实现用户自动登录功能
  7. Linux中的无人职守安装脚本kickstart
  8. php消除连续字符,JS字符串去除连续或全部重复字符的实例
  9. java如何调用thrift_java – 我想在一个传输上使用多个服务(Thrift)
  10. Java线程池中submit()和execute()方法有什么区别