• JavaThread等待/通知经典范式


    JavaThread等待/通知经典范式

    package com.stono.thread;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.concurrent.TimeUnit;
    
    public class WaitNotify {
        static boolean flag = true;
        static Object lock = new Object();
        
        public static void main(String[] args) throws InterruptedException {
            Thread waitThread = new Thread(new Wait(), "WaitThread");
            waitThread.start();
            TimeUnit.SECONDS.sleep(10);
            Thread notifyThread = new Thread(new Notify(), "NotifyThread");
            notifyThread.start();
        }
        
        static class Wait implements Runnable{
    
            @Override
            public void run() {
                // 加锁,拥有lock的Monitor
                synchronized (lock) {
                    // 当条件满足时,继续wait,同时释放了lock的锁
                    while(flag){
                        try {
                            System.out.println(Thread.currentThread()+" flag is true. wait @ "+new SimpleDateFormat("HH:mm:ss").format(new Date()));
                            lock.wait();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    // 条件不满足时,完成工作
                    System.out.println(Thread.currentThread()+" flag is false. running @"+new SimpleDateFormat("HH:mm:ss").format(new Date()));
                }
            }
            
        }
        static class Notify implements Runnable{
    
            @Override
            public void run() {
                // 加锁,拥有lock的Monitor
                synchronized (lock) {
                    // 获取lock的锁,然后进行通知,通知时不会释放lock的锁,
                    // 直到当前线程释放了lock后,WaitThread才能从wait方法中返回
                    System.out.println(Thread.currentThread() + " hold lock. notify @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
                    lock.notifyAll();
                    flag = false;
                    SleepUtils.second(10);
                }
                // 再次加锁
                synchronized (lock) {
                    System.out.println(Thread.currentThread()+" hold lock again. sleep @ "+new SimpleDateFormat("HH:mm:ss").format(new Date()));
                    SleepUtils.second(10);
                }
            }
            
        }
    }

    经典范式

    synchronized(object){

      while(条件不满足){

        object.wait();

      }

      逻辑处理;

    }

    synchronized(object){

      改变条件

      object.notifyAll();

    }

  • 相关阅读:
    javascript中数据类型转换那些事
    CSS布局奇淫技巧之高度自适应
    用innerHTML插入html代码中有样式表时需注意的地方
    详解ASP.NET Core API 的Get和Post请求使用方式
    Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)(转)
    c# int byte转换
    Linux操作系统内核源码目录结构详解
    Linux/Ubuntu sudo不用输入密码的方法
    DirectX简介
    在VC工程中添加多语言支持
  • 原文地址:https://www.cnblogs.com/stono/p/8365175.html
Copyright © 2020-2023  润新知