zoukankan      html  css  js  c++  java
  • 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();

    }

  • 相关阅读:
    ege demo
    Easy Graphics Engine vs2015使用
    c++ demo
    leetcode 13 -> Roman to Integer
    leetcode 12 -> Integer to Roman
    12. Integer to Roman
    leetcode 9 -> Palindrome Number
    8. String to Integer (atoi)
    获取字符串中长度最长的回文字符串
    leetcode 5-> Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/stono/p/8365175.html
Copyright © 2011-2022 走看看