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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦大忠 中级黑马   /  2013-8-30 10:29  /  1598 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘才新 于 2013-9-1 11:13 编辑

生产者消费者练习题:
package com.qindazhong1;
import java.util.Random;
import java.util.Vector;

public class SynTest {
        public static void main(String[] args){
                SynStack stack = new SynStack();
                Thread producer1 = new Thread(new Producer(stack));
                Thread consummer1 = new Thread(new Consummer(stack));
                producer1.start();
                consummer1.start();
        }
}

class SynStack {
        private Vector<Integer> list = new Vector<Integer>();
        
        public synchronized int pop(){
                int c ;
                while(list.size()==0){
                        try{
                                this.wait();
                        }catch(Exception e){}
                }
                c = list.remove(list.size()-1);  //进行弹栈操作
                return c ;
        }
        
        public synchronized void push(int c){
                this.notify();
                try{
                        Thread.sleep(100);
                }catch(Exception e){}
                list.addElement(c);
        }
}


class Producer implements Runnable{        
        private SynStack theStack;
        public Producer(SynStack s){
                this.theStack = s ;
        }
        public void run(){
                int c = (new Random()).nextInt(new Integer(9));
                theStack.push(c);
                System.out.println("生产者生产了一个数字"+c);
        }
}

class Consummer implements Runnable {
        private SynStack theStack = new SynStack();
        public Consummer(SynStack s){
                this.theStack = s ;
        }
        public void run(){
                int i = theStack.pop();
                System.out.println("消费者取出了一个数字"+i);
        }
}

现在实现了生产一个数字 ,然后打印一个数字,怎么让他一直生产一直打印呢?怎么修改代码,请把你修改代码的地方注释一下便于我理解,谢谢,重新写一个能实现的程序更好。题目是:编写生产者消费者模式的程序。生产者每隔100ms产生一个0~9之间的数字,保存在MyNumber类型的对象中,并显示出来。只要MyNumber类型中存在数据就将其取出并显示。试定义MyNumber类,编写生产者消费者程序,并编写主程序创建一个MyNumber对象,以及一个生产者线程个一个消费者线程并将这两个线程西东并运行。我写程序的和题目有偏离

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 大忠,看好你哟!

查看全部评分

5 个回复

倒序浏览
因为你的生产者线程只执行了一次,线程就执行完成了,消费者也是同样的道理。分别把你的生产者和消费者线程run方法中用一个while控制一下,具体部分代码如下:
生产者线程修改如下
  public void run(){
                while(true)
                {
                int c = (new Random()).nextInt(new Integer(9));
                theStack.push(c);
                System.out.println("生产者生产了一个数字"+c);
                }
        }
消费者线程修改如下:
public void run(){
                while(true)
                {
                int i = theStack.pop();
                System.out.println("消费者取出了一个数字"+i);
                }
        }

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
package com.qindazhong1;
import java.util.Random;
import java.util.Vector;

public class SynTest {
        public static void main(String[] args){
                SynStack stack = new SynStack();
                Thread producer1 = new Thread(new Producer(stack));
                Thread consummer1 = new Thread(new Consummer(stack));
                producer1.start();
                consummer1.start();
        }
}

class SynStack {
        private Vector<Integer> list = new Vector<Integer>();
        
        public synchronized int pop(){
                int c ;
                while(list.size()==0){
                        try{
                                this.wait();
                        }catch(Exception e){}
                }
                c = list.remove(list.size()-1);  //进行弹栈操作
                return c ;
        }
        
        public synchronized void push(int c){
                this.notify();
                try{
                        Thread.sleep(100);
                }catch(Exception e){}
                list.addElement(c);
        }
}


class Producer implements Runnable{        
        private SynStack theStack;
        public Producer(SynStack s){
                this.theStack = s ;
        }
        public void run(){
                //在这里用while(true)实现无限循环
                while(true) {
                int c = (new Random()).nextInt(new Integer(9));
                theStack.push(c);
                System.out.println("生产者生产了一个数字"+c);
                }

        }
}

class Consummer implements Runnable {
        private SynStack theStack = new SynStack();
        public Consummer(SynStack s){
                this.theStack = s ;
        }
        public void run(){
                //在这里用while(true)实现无限循环
                while(true) {
                int i = theStack.pop();
                System.out.println("消费者取出了一个数字"+i);
                }

        }
}

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 !以后尽量多些文字说明。不然问题一难会让.

查看全部评分

回复 使用道具 举报
嵿級↘莮紸角 发表于 2013-8-30 12:55
package com.qindazhong1;
import java.util.Random;
import java.util.Vector;

!以后尽量多些文字说明。不然问题一难会让人看得很费劲.
回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
潘哥,谢谢!这声大忠感觉太亲切了,哇哇哇...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马