美文网首页程序员
Object的wait(),notify()

Object的wait(),notify()

作者: 尉昌达 | 来源:发表于2020-07-11 08:58 被阅读0次
    • wait() 阻塞,释放锁
    • notify() 通知阻塞的那个线程到就绪状态,但不是让出锁给他,被唤醒的线程要运行必须得获得锁。

    示例:

    public class NotifyFreeLock {
    
        //添加volatile,使t2能够得到通知
        volatile List lists = new ArrayList();
    
        public void add(Object o) {
            lists.add(o);
        }
    
        public int size() {
            return lists.size();
        }
        
        public static void main(String[] args) {
            T04_NotifyFreeLock c = new T04_NotifyFreeLock();
            
            final Object lock = new Object();
            
            new Thread(() -> {
                synchronized(lock) {
                    System.out.println("t2启动");
                    if(c.size() != 5) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("t2 结束");
                    //通知t1继续执行
                    lock.notify();
                }
                
            }, "t2").start();
            
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
    
            new Thread(() -> {
                System.out.println("t1启动");
                synchronized(lock) {
                    for(int i=0; i<10; i++) {
                        c.add(new Object());
                        System.out.println("add " + i);
                        
                        if(c.size() == 5) {
                            lock.notify();
                            //释放锁,让t2得以执行
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        
                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }, "t1").start();
            
            
        }
    }
    

    相关文章

      网友评论

        本文标题:Object的wait(),notify()

        本文链接:https://www.haomeiwen.com/subject/krkqcktx.html