黑马程序员技术交流社区

标题: 怎么实现无线循环,思路卡住了 [打印本页]

作者: 秦大忠    时间: 2013-8-30 10:29
标题: 怎么实现无线循环,思路卡住了
本帖最后由 潘才新 于 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对象,以及一个生产者线程个一个消费者线程并将这两个线程西东并运行。我写程序的和题目有偏离


作者: loading……99.9    时间: 2013-8-30 12:24
因为你的生产者线程只执行了一次,线程就执行完成了,消费者也是同样的道理。分别把你的生产者和消费者线程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);
                }
        }
作者: 嵿級↘莮紸角    时间: 2013-8-30 12:55
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);
                }

        }
}
作者: 潘才新    时间: 2013-8-30 18:34
嵿級↘莮紸角 发表于 2013-8-30 12:55
package com.qindazhong1;
import java.util.Random;
import java.util.Vector;

!以后尽量多些文字说明。不然问题一难会让人看得很费劲.

作者: 黄文伯    时间: 2013-8-30 20:17
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
作者: 秦大忠    时间: 2013-8-31 09:00
潘哥,谢谢!这声大忠感觉太亲切了,哇哇哇...




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2