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

时间:2022-05-15 14:32:44

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();
}
}

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