跟我学编程20:线程间通信 wait/notify机制「建议收藏」

跟我学编程20:线程间通信 wait/notify机制「建议收藏」import java.util.ArrayList;import java.util.

欢迎大家来到IT世界,在知识的湖畔探索吧!

跟我学编程20:线程间通信 wait/notify机制「建议收藏」

import java.util.ArrayList;
import java.util.List;
 
public class MyList {
 
    private static List<String> list = new ArrayList<String>();
 
    public static void add() {
        list.add("aaaaa");
    }
 
    public static int size() {
        return list.size();
    }
}
 
 
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("wait begin "+ System.currentTimeMillis());
                  
                    lock.wait();
                  
                    System.out.println("wait end  "+ System.currentTimeMillis());
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
 
 
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();
        }
    }
}
 




public class Run {
 
    public static void main(String[] args) {
 
        try {
            Object lock = new Object();
 
            ThreadA a = new ThreadA(lock);
            a.start();
 
            Thread.sleep(50);
 
            ThreadB b = new ThreadB(lock);
            b.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

欢迎大家来到IT世界,在知识的湖畔探索吧!

线程A要等待某个条件满足时(list.size()==5),才执行操作。

线程B则向list中添加元素,改变list 的size。

A,B之间如何通信的呢?也就是说,线程A如何知道 list.size() 已经为5了呢?

这里用到了Object类的 wait() 和 notify() 方法。

当条件未满足时(list.size() !=5),线程A调用 wait() 放弃CPU,

并进入阻塞状态。—不需要轮询判断 那样占用CPU

当条件满足时,线程B调用 notify()通知 线程A,所谓通知线程A,就是唤醒线程A,并让它进入可运行状态。

这种方式的一个好处就是CPU的利用率提高了。

但是也有一些缺点:

比如,线程B先执行,一下子添加了5个元素并调用了notify()发送了通知,

而此时线程A还未执行,当线程A执行并调用wait()时,那它永远就不可能被唤醒了。

因为,线程B已经发了通知了,以后不再发通知了。

这说明:通知过早,会打乱程序的执行逻辑。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17848.html

(0)
上一篇 2023年 7月 14日 下午3:00
下一篇 2023年 7月 16日 下午4:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信