3.1.1多线程通讯(等待通知机制)

来源:互联网 发布:旅馆住宿登记软件 编辑:程序博客网 时间:2024/06/05 04:21

wait()方法:使当前执行代码的线程等待,当前线程释放锁,在wait处停止执行代码,直到接到通知或被中断。在使用wait前面,线程必须获得太对象的对象锁。

notify方法:唤醒某个处于wait状态线程,使用之前,必须先获得该对象的对象锁,直到执行完同步块代码之后,wait状态的线程才会获得锁。

package test;/** * Created by sunyifeng on 17/10/15. */public class MyThread1 extends Thread {    private Object lock;    public MyThread1(Object lock) {        super();        this.lock = lock;    }    @Override    public void run(){        try {            synchronized (lock) {                System.out.println("开始等待时间:" + System.currentTimeMillis());                lock.wait();                System.out.println("结束等待时间:" + System.currentTimeMillis());            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package test;/** * Created by sunyifeng on 17/10/15. */public class MyThread2 extends Thread {    private Object lock;    public MyThread2(Object lock) {        super();        this.lock = lock;    }    @Override    public void run() {        synchronized (lock) {            System.out.println("开始唤醒时间:" + System.currentTimeMillis());            lock.notify();            System.out.println("结束唤醒时间:" + System.currentTimeMillis());        }    }}

package test;/** * Created by sunyifeng on 17/10/15. */public class Run {    public static void main(String[] args) {        try {            // 锁            Object lock = new Object();            // 线程1            MyThread1 myThread1 = new MyThread1(lock);            myThread1.start();            //            Thread.sleep(3000);            // 线程2            MyThread2 myThread2 = new MyThread2(lock);            myThread2.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
运行结果:

开始等待时间:1508077481913
开始唤醒时间:1508077484918
结束唤醒时间:1508077484919
结束等待时间:1508077484919

总结:wait使线程停止运行,notify使停止的线程继续运行。

再举一个栗子。

package demo;import java.util.List;import java.util.ArrayList;/** * Created by sunyifeng on 17/10/15. */public class MyList {    private static List<String> list = new ArrayList<String>();    public static void add() {        list.add("sunyf");    }    public static int size() {        return list.size();    }}
package demo;/** * Created by sunyifeng on 17/10/15. */public class ThreadA extends Thread {    private Object lock;    public ThreadA(Object lock) {        super();        this.lock = lock;    }    @Override    public void run() {        try {            synchronized (lock) {                if (MyList.size() != 5) {                    System.out.println("等待开始,时间:" + System.currentTimeMillis());                    lock.wait();                    System.out.println("等待结束,时间:" + System.currentTimeMillis());                }            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/15. */public class ThreadB extends Thread {    private Object lock;    public ThreadB(Object lock) {        super();        this.lock = lock;    }    @Override    public void 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();        }    }}
package demo;/** * Created by sunyifeng on 17/10/15. */public class Run {    public static void main(String[] args) {        try {            Object lock = new Object();            //            ThreadA threadA = new ThreadA(lock);            threadA.setName("A");            threadA.start();            //            Thread.sleep(1000);            //            ThreadB threadB = new ThreadB(lock);            threadB.setName("B");            threadB.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
运行结果:

等待开始,时间:1508079281022
添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
已经发出通知
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素
等待结束,时间:1508079292058

程序说明:notify方法执行之后并不是立即释放锁,直到同步块的代码执行完才释放锁。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 夫妻之间性格不合怎么办 小孩早上起太早怎么办 老人忌日忘了怎么办 五行金水太旺怎么办 土命人偏偏水多怎么办 小野鸡不吃东西怎么办 宝宝发烧一天一夜不退怎么办 跟老公八字不合怎么办 做俯卧撑胸肌疼怎么办 健身完肌肉酸痛怎么办 不小心杀生了怎么办 名字取得太大了怎么办 麻将馆没客人怎么办 顺丰快递着急怎么办 孕妇吃菠萝过敏怎么办 燕窝炖稀了怎么办 玻尿酸隆鼻变宽怎么办? 三无燕窝被打假 怎么办 喜用神为土应该怎么办 喜用神互相克害怎么办? 姓名总格不好怎么办 姓名学里人格不好怎么办 买家订单下不了怎么办 公积金不够月供怎么办 房贷担保费没交怎么办 营业执照过期1年怎么办 营业执照和公章丢失怎么办 个体户怎么办对公账户 公章法人章丢失怎么办 广州买房没有社保怎么办 辞职后计生关系怎么办 广州换工作社保怎么办 学校更名了盖章怎么办 工商注册资金没有交怎么办 住公司宿舍怎么办居住证 住在公司宿舍怎么办居住证 滴滴没有的车型怎么办 假的租房合同怎么办 代注册公司被骗怎么办 公司跨区迁址怎么办 公司搬走注册地怎么办