进程线程调度的主要功能有 线程间通信的几种方法( 二 )


③等待/通知机制
代码如下:
导入Java . util . ArrayList;导入Java . util . list;公共类MyList {私有静态列表& lt字符串& gtlist = new ArrayList & lt字符串& gt();public static void add(){ list . add(” any string “);}公共静态int size(){ return list . size();} }公共类ThreadA扩展线程{私有对象锁;public ThreadA(对象锁){ super();this.lock = lock} @ Override public void run(){ try { synchronized(lock){ if(my list . size()!= 5){ system . out . println(” wait begin “+system . current time millis());lock . wait();system . out . println(” wait end “+system . current time millis());} } } catch(interrupted exception e){ e . printstacktrace();} } }公共类ThreadB扩展线程{私有对象锁;public ThreadB(对象锁){ super();this.lock = lock} @覆盖public void run(){ try { synchronized(lock){ for(int I = 0;我& lt10;i++){ my list . add();if(my list . size()= = 5){ lock . notify();System.out.println(“已发送通知”);} system . out . println(” added “+(I+1)+”元素!”);thread . sleep(1000);} } } catch(interrupted exception e){ e . printstacktrace();} } } public class Run { public static void main(String[]args){ try { Object lock = new Object();ThreadA a = new ThreadA(lock);a . start();线程.睡眠(50);ThreadB b = new ThreadB(lock);b . start();} catch(interrupted exception e){ e . printstacktrace();}}}线程A会等到满足某个条件(list.size()==5)才执行操作 。线程B将元素添加到列表中,并改变列表的大小 。
A和B是如何相互交流的?也就是线程A怎么知道list.size()已经是5了?
这里使用了Object类的wait()和notify()方法 。
不满足条件时(list.size()!=5),线程A调用wait()放弃CPU,进入阻塞状态 。-轮询时不会像②那样占用CPU 。
当条件满足时,线程B调用notify()通知线程A,所谓通知线程A就是唤醒线程A,使其运行 。
这种方法的一个好处是提高了CPU的利用率 。
但也有一些缺点:比如线程B先执行,一次加五个元素并调用notify()发送通知,而此时线程A仍在执行;当线程A执行并调用wait()时,它永远无法被唤醒 。因为,线程B已经发了通知,不会再发了 。注意:提前通知会打乱程序的执行逻辑 。
④管道通信
就是用java.io.PipedInputStream和java.io.PipedOutputStream进行通信 。
具体就不介绍了 。分布式系统中的两种通信机制:共享内存机制和消息通信机制 。感觉①中的synchronized关键字和②中的while polling属于共享内存机制 。当轮询条件被volatile关键字修改时,意味着它们通过判断“共享条件变量”是否发生变化来实现进程间的通信 。
另一方面,管道通信更像是一种消息传递机制,也就是说,来自一个线程的消息通过管道发送到另一个线程 。
有关等待/通知的更多信息,请参考:
http://www.cnblogs.com/hapjin/p/5492645.html
最后,我是一个从事开发多年的Java老程序员 。我辞掉了工作,目前正在做自己的Java个人定制课程 。今年年初,我花了一个月的时间整理了一个最适合2019年学习的干货Java学习产品,可以送给每一个喜欢Java的小伙伴 。想要获取,可以关注我的头条号,后台私信我:01,免费获取 。