java个人学习笔记18(多线程之间通信+等待唤醒机制)

来源:互联网 发布:淘宝客成功的原因 编辑:程序博客网 时间:2024/04/28 14:06

1.多线程之间的通信

同步机制:解决了没生产就消费的问题,即互斥的执行setRes()和getRes()中的代码
等待唤醒机制:解决对同一个资源多次消费的问题,即达到生产一个就消费一个
wait():该方法可以让线程处于等待状态,并将线程临时存储到线程池中。
notify():唤醒指定线程池中的任意一个。
notifyAll():唤醒指定线程池中的所有线程。
以上方法均应在同步中使用(都是Object的方法),他们是用来操作同步锁上线程状态的
在使用这些方法时,必须标识他们所属于的锁,标识方式是 锁对象.wait() 锁对象.notify() 锁对象.notifyAll();

//共享资源class Res{private String name;private int num = 1;//定义flag标记,为true表示存在一个未被消费的资源,为false表示资源已被消费。private boolean flag;//生产资源public synchronized void setRes(String name){//判断标记,存在未被消费的资源则进程等待if(flag)try{wait();}catch(InterruptedException e){}this.name = name+"..."+num;num++;System.out.println(Thread.currentThread().getName()+"...Producer..."+this.name);//修改flag标记flag = true;//唤醒消费者notify();}//消费资源public synchronized void getRes(){//判断标记,资源已被消费则进程等待if(!flag)try{wait();}catch(InterruptedException e){}System.out.println(Thread.currentThread().getName()+"...Customer..."+name);//修改标记flag = false;//唤醒生产者notify();}}//生产者class Pro implements Runnable{private Res r;Pro(Res r){this.r = r;}public void run(){while(true)r.setRes("phone");}}//消费者class Cus implements Runnable{private Res r;Cus(Res r){this.r = r;}public void run(){while(true)r.getRes();}}class ProducerCustomerDemo{public static void main(String[] args) {//创建一个资源Res r = new Res();//创建两个任务Pro p = new Pro(r);Cus c = new Cus(r);//创建两个线程Thread t1 = new Thread(p);Thread t2 = new Thread(c);t1.start();t2.start();}}


0 0
原创粉丝点击