本帖最后由 ぺsimon☆ 于 2013-4-23 09:26 编辑
- /**
- 生产者和消费者的基本版本
- */
- class Resource//定义一个资源类
- {
- private String name; //定义一个字符串name
- private int count=1; //定义一个计数器
- boolean flag=false;
- public synchronized void set(String name) //定义一个同步函数set
- {
- while(true) //定义一个无限循环
- {
- while(flag) //判断flag 问题:为什么这句话是if(flag)的话,线程醒来之后,就不会重新判断flag的值,而改成while(flag)后,线程醒来之后都会重新判断flag的值呢?while(flag)下面加{},把下面的语句括起来,和不加{}把下面的语句括起来有什么区别呢?
- try{this.wait();}catch(Exception e){} //处理wait异常
- this.name=name+"---"+count++; //把name赋值给对象的name
- System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
- flag=true;
- this.notifyAll(); //唤醒所有线程
- }
- }
- public synchronized void get() //定义一个同步函数get
- {
- while(true) //定义一个无限循环
- {
- while(!flag) //判断flag
- try{this.wait();}catch(Exception e){} //处理异常
- System.out.println(Thread.currentThread().getName()+"消费者"+this.name);
- flag=false;
- this.notifyAll(); //唤醒所有线程
- }
- }
- }
- class Produce implements Runnable //定义生产者类并实现Runnable
- {
- private Resource res;
- Produce(Resource res) //构造函数初始化,并接受类类型变量res
- {
- this.res=res; //把接收进来的res赋值给对象的res
- }
- public void run() //覆盖run方法
- {
- res.set("商品"); //调用set方法并传值
- }
- }
- class Consumer implements Runnable //定义消费者类并实现Runnable
- {
- private Resource res;
- Consumer(Resource res) //构造函数初始化,并接受类类型变量res
- {
- this.res=res; //把接收进来的res赋值给对象的res
- }
- public void run() //覆盖run方法
- {
- res.get(); //调用get方法
- }
- }
- class ProConDemo
- {
- public static void main(String[] args)
- {
- Resource res=new Resource(); //创建资源对象
-
- new Thread(new Produce(res)).start(); //创建线程并开启线程
- new Thread(new Consumer(res)).start();//创建线程并开启线程
- }
- }
复制代码 问题:
while(true) //定义一个无限循环
{
while(flag) //判断flag 问题1:为什么这句话是if(flag)的话,线程醒来之后,就不会重新判断flag的值,而改成while(flag)后,线程醒来之后都会重新判断flag的值呢?
问题2:while(flag)下面加{},把下面的语句括起来,和不加{}把下面的语句括起来有什么区别呢?
try{this.wait();}catch(Exception e){} //处理wait异常
|