如何通过一个例子来描述线程wait和notify
更新:HHH   时间:2023-1-7


这期内容当中小编将会给大家带来有关如何通过一个例子来描述线程wait和notify,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

场景:一个类中,一个是往容器中添加元素的方法,一个是返回容器大小的方法,现在又两个线程,A线程调用添加方法,B线程调用返回容器大小方法,当大小为5的时候,B线程提示并结束。

代码可直接复制,运行:

public class UseWaitAndNotify {
    volatile List list = new ArrayList();//这里为什么使用volatile,请看:https://my.oschina.net/u/4049911/blog/3121294  
    public void add(Object o) {
        list.add(o);
    }
    public int size() {
        return list.size();
    }
    public void useWaitAndNotify() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (this) {
                    System.out.println("size方法开始");
                    /**
                     * 这里必须得是不等于5,因为刚开始肯定不等于5,然后才会进这个方法,执行wait方法,这个线程就会在wait那等着。
                     * 然后cpu执行另一个方法,当另一个方法执行等于5是,使用notify唤醒等待的线程(等待同一个锁的线程)。
                     * 然后从wait方法开始往下执行,到结束。
                     */
                    if(list.size()!=5) {
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    System.out.println("size方法结束");
                }
            }
        }).start();
        synchronized (this) {
            System.out.println("add方法开始");
            for(int i=0;i<10;i++) {
                /**
                 *当加入元素==5时,当前线程就应该停止,让出cpu,让cpu去执行其他线程。
                 *那让线程让出cpu的方法有哪些呢:
                 *wait让出线程,释放锁
                 *yield 让出cpu,但不会释放锁
                 *join 插入其他线程,线程同步作用,在被调用线程未结束前,当前线程将一直阻塞在join处
                 *
                 *我们使用wait
                 *
                 */
                list.add(new Object());
                if(i==4) {
                    /**
                     * 这里为什么使用notify后,又使用wait呢,就是上面这个方法的意思,使用notify,当前线程是不会释放锁的,所以即使唤醒了其他
                     * 线程,其他线程拿不到锁,也执行不了。
                     * 也就是说如果下面不使用wait,当list等于5的时候,另一个线程拿不到锁,执行不了,只有当前线程释放锁,另一个线程才会拿到锁执行,
                     * 也就是说当list的size等于10的时候,另一个线程才会停止
                     */
                    this.notify();
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println("add方法结束");
            }
        }
    }

    @Test
    public void test() {  
        //使用wait和notify实现  
        useWaitAndNotify();  
    }  
}

因为wait和notify只能在锁中使用,所以需要加上synchronized锁

上述就是小编为大家分享的如何通过一个例子来描述线程wait和notify了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注天达云行业资讯频道。

返回大数据教程...