Wait与Notify

来源:互联网 发布:中国网络电视在线直播 编辑:程序博客网 时间:2024/06/05 13:43
import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.TimeUnit;import com.afan.util.SleeepUtils;public class WaitNotify {    static boolean flag = true;    static Object lock = new Object();    public static void main(String[] args) {        Thread waitThread = new Thread(new Wait(),"waitThread");        waitThread.start();        try {            TimeUnit.SECONDS.sleep(10);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        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 was"                            + new SimpleDateFormat("HH:mm:ss").format(new Date()));                        lock.wait();                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        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;                SleeepUtils.second(5);            }            //再次加锁            synchronized (lock) {                System.out.println(Thread.currentThread() +"hold lock again sleep"                        + new SimpleDateFormat("HH:mm:ss").format(new Date()));                SleeepUtils.second(5);            }        }    }}
原创粉丝点击