您的位置:首页 > 编程语言 > Java开发

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

2014-05-08 21:33 627 查看
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();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐