A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王飞 中级黑马   /  2012-7-21 19:48  /  1517 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package 线程间的通信;

public class 生产者和消费者 {


        public static void main(String[] args) {
                 

                Shangp sp = new Shangp();
                Input i  = new Input(sp);
                Output o = new Output(sp);
               
                Thread t1 = new Thread(i);
                Thread t2 = new Thread(o);
               
                t1.start();
                t2.start();
        }

}



class Input implements Runnable
{
        Shangp s;
        public Input(Shangp s)
        {
                this.s = s;
        }

        public void run()
        {
                while(true)
                {
                        try
                        {
                                s.set("商品");
                        }
                         catch (Exception e) {
                                 
                        }
                }

        }
       
}

class Output implements Runnable
{
        Shangp s ;
        public Output(Shangp s)
        {
                this.s = s;
        }
        public void run()
        {
                while(true)
                {
                        try
                        {
                                        s.get();
                        }
                        catch (Exception e) {
                         
                        }
                         
                }

        }
}


class Shangp
{
        String name ;
        String xinxi;
        int count = 0;
        boolean flag = false;

        public synchronized void set(String name)throws InterruptedException
        {
               
                while(!flag)//-----为true时开始生产
                {       
                        if(flag)wait();
                        this.name = name+count+++"-------";
                        System.out.println("生产"+count);
                        flag = true;
                        notify();
                }                 
                 
        }
        public synchronized void get() throws InterruptedException
        {
                while(flag)//-----为false时开始消费
                {        if(flag)wait();   //为false就直接放弃执行权
                        System.out.println(".....消费"+count);
                        flag = false;   //切换标识
                        notify();  //唤醒线程
                }
                   //求救:为什么我这里只生产了1,就不在生产了啊。。。。
        }
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
你生产完毕将标识符设为了true,在消费者中你的判断条件是当标识为真就休眠.....所以线程阻塞了,只需要把消费者的标识符改为!flag即可.....试试吧

public class 生产者和消费者 {
public static void main(String[] args) {
  Shangp sp = new Shangp();
  Input i = new Input(sp);
  Output o = new Output(sp);
  Thread t1 = new Thread(i);
  Thread t2 = new Thread(o);
  t1.start();
  t2.start();
}
}
class Input implements Runnable {
Shangp s;
public Input(Shangp s) {
  this.s = s;
}
public void run() {
  while (true) {
   try {
    s.set("商品");
   } catch (Exception e) {
   }
  }
}
}
class Output implements Runnable {
Shangp s;
public Output(Shangp s) {
  this.s = s;
}
public void run() {
  while (true) {
   try {
    s.get();
   } catch (Exception e) {
   }
  }
}
}
class Shangp {
String name;
String xinxi;
int count = 0;
boolean flag = false;
public synchronized void set(String name) throws InterruptedException {
  while (!flag)// -----为true时开始生产
  {
   if (flag)
    wait();
   this.name = name + count++ + "-------";
   System.out.println("生产" + count);
   flag = true;//-----------------------------------------------------1.
   notify();
  }
}
public synchronized void get() throws InterruptedException {
  while (flag)// -----为false时开始消费
  {
   if (!flag)//这个地方你的标识符错误,改成这样就可以了。试试吧----2
    wait(); //
   System.out.println(".....消费" + count);
   flag = false;
   notify();
  }

}
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
while(flag)//-----为false时开始消费
                {        if(flag)wait();   //为false就直接放弃执行权//这一个语句应该为if(!flag)wait();
                        System.out.println(".....消费"+count);
                        flag = false;   //切换标识
                        notify();  //唤醒线程
                }

既然你循环和线程判定条件都用flag,那么就应该让他们相反。
回复 使用道具 举报

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马