• 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();

    }

  • 相关阅读:
    如何将asp.net MVC2项目升级为MVC3项目(微软官方自动升级工具:ASP.NET MVC 3 Application Upgrader )
    扩展Html Helper类,ASP.NET MVC框架提供了一个帮助我们构造Html元素的类:TagBuilder
    详解ASP.NET MVC2项目升级到MVC 3 RC
    NHibernate学习
    ASP.MVCNOTE
    MVC问题反馈页面代码
    Silverlightnote
    jqGrid
    必须掌握的八个DOS命令
    分页且带条件的存储过程
  • 原文地址:https://www.cnblogs.com/stono/p/8365175.html
Copyright © 2020-2023  润新知