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

Java多线程学习之生产者消费者问题(一)

2017-07-03 22:25 513 查看
package javaapplication2;

/**
*生产者消费者问提
* 为使达到生产一个消费一个的目的,使用等待唤醒机制
* wait():该方法可以让线程处于冻结状态,并将线程存储到线程池中
* notify():唤醒指定线程池中的任意一个线程
* notifyAll():唤醒指定线程池中的所有线程
* 这些方法必须使用在同步中,因为它们用来操作同步锁上的线程状态
* 在使用这些方法时,必须标识它们所属的锁,标识方式就是 锁对象.wait() 锁对象.notify() 锁对象.notifyAll()
* 相同锁的notify(),可以获取相同锁的wait();
* @author tf
*/
class Res
{
private String name;
private int count;
//定义标记
private boolean flag;
//提供给商品赋值的方法
public synchronized void set(String name)
{
if(flag)//判断标记为true,执行wait等待,为false就生产
try{ wait();}catch (InterruptedException e){}
this.name=name+"--"+count;
count++;
System.out.println(Thread.currentThread().getName()+"....生产者...."+this.name);
//生产完毕,将标记改为true
flag=true;
//唤醒消费者
notify();
}
//提供一个商品获取的方法
public synchronized void get()
{
if(!flag)
try{ wait();}catch (InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"....消费者...."+this.name);
//将标记改为false
flag=false;
//唤醒生产者
notify();
}
}
//生产者
class Producer implements Runnable
{
private Res r;
Producer (Res r)
{
this.r=r;
}
public void run()
{
r.set("面包");
}
}
//消费者
class Consumer implements Runnable
{
private Res r;
Consumer(Res r)//构造函数
{
this.r =r;
}
public void run()
{
r.get();
}
}
public class JavaApplication2 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//创建资源
Res r=new Res();
//创建任务
Producer pro=new Producer(r);
Consumer con=new  Consumer(r);
//创建线程
Thread t1=new Thread(pro);
Thread t2=new Thread(con);
t1.start();
t2.start();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程