【Java多线程】等待通知机制(二)等待通知机制的使用

synchronized可以将如何一个Object对象作为同步对象来看待,Java为每个Object都实现了wait和notify()方法。notify()方法可以使调用该方法唤醒等待队列中等待同一资源的“一个线程”,并使该线程退出等待队列,进入可运行状态。仅通知一个。notifyAll()方法可以通知共享资源的“全部线程”。现在,来改造一个上一篇文章中的代码。

MyList.class

public class MyList {
    private static List list = new ArrayList();

    public static void add() {
        list.add("yuyufeng");
    }

    public static int size() {
        return list.size();
    }

}

ThreadA.class

public class ThreadA extends Thread {
    private Object lock;

    public ThreadA(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        super.run();
        try {
            synchronized (lock) {
                for (int i = 0; i < 10; i++) {
                    MyList.add();
                    if (MyList.size() == 5) {
                        lock.notify();
                        System.out.println("已发出通知");
                    }
                    System.out.println("添加了" + (i + 1) + "个元素");
                    Thread.sleep(1000);
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ThreadB.class

public class ThreadB extends Thread {
private Object lock;

public ThreadB(Object lock) {
    this.lock = lock;
}

@Override
public void run() {
    super.run();
    try {
        synchronized (lock) {
            System.out.println("lock.begin" + System.currentTimeMillis());
            if (MyList.size() != 5) {
                lock.wait();
            }
            System.out.println("lock.end" + System.currentTimeMillis());
            Thread.sleep(100);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

AppTest.class

public class AppTest {
    public static void main(String[] args) {
        try {
            Object lock = new Object();
            ThreadB b = new ThreadB(lock);
            b.setName("B");
            b.start();

            Thread.sleep(50);

            ThreadA a = new ThreadA(lock);
            a.setName("A");
            a.start();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行

lock.begin1552892280848
添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
已发出通知
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素
lock.end1552892290902
发布了154 篇原创文章 · 获赞 142 · 访问量 35万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览