新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Java/Eclipse 』 → 关于用JAVA实现生产者-消费者机制 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5387 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 关于用JAVA实现生产者-消费者机制 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客楼主
    发贴心情 关于用JAVA实现生产者-消费者机制

    [B][B]   近日,学校布置了一段用JAVA实现生产者-消费者原理的代码,要求生产者输入一段无大小顺序的数值例如;5,7,8,0,.....然后消费者要按从小到大的顺序读出数值,也以上面那段数值为例子,先要读出5,就要先读出0,如此类推.....譬如说生产者把"2"这个数放进队列里面,这时候消费者不能读取,因为"2"不是0到N之中最小的数值,这时候来个"6",同样消费者不读取,"2""6"就放在队列里面,一直等到"0"出现,消费者才读取,当然消费者就等待下一个下一个0到N中第二小的数目----"1".在这期间来的其余数字都放在队列里面等待处理.
      下面是我的一个同学写的代码,有些地方看不明白,想请教下大家.....

    import java.util.*;
            
    public class Queue
    {
       private int length;
       private int size;  
       private int[] values;
       private int head;  
       private int last;
      
    public Queue()
    {
           this(100);
    }
    public Queue(int n)
    {  
           values = new int[n];
           size = n;
           length = 0;
           head = -1;                                                
           last = -1;                                                      //这个 head 跟 last在这里有什么作用?  }
       
    synchronized public void removeLowestValue()       //请问这个方法为什么要这样写 {
         if(!isEmpty())
         {
             if(head != last)
                 head++;
             if(head >= size)
                 head -= size;          //这里如果两个IF条件不成立的话,分别会跳转到哪里?
             length--;
         }    
      }
        
      synchronized public int getLowestValue()
      {
          if(!isEmpty())
          {
              return values[head];
          }    
          return -1;    
      }
        
      synchronized public boolean isEmpty()
      {
            return (length == 0);
       }
      synchronized public void addValue(int n)         //请问这个方法为什么要这样写

      {
          if(length < size)                                      //在什么情况下会length < size呢?
          {
              if(isEmpty())
              {
                  head++;
              }
              last++;
              if(last >= size)
                  last -= size;                                         //这里为什么要这样实现
              values[last] = n;
              length++;
          }    
       }
    }
      [/B][/B]


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:20:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客2
    发贴心情 
    import java.util.*;

    /** An dieser Klasse duerfen keine Aenderungen vorgenommen werden. */
    public class Producer extends Thread {

        private final Queue q;                                    //这里private final有什么作用?为什么这里不用NEW?   
    private final int   n;

        public Producer(Queue q, int numInputValues) {
            super();
            this.q = q;
            this.n = numInputValues;
        }

        public void run() {
            int[] inputValues = new int[n];
            for (int i = 0; i < n; i++) {
                inputValues[i] = i;
            }

            // Generiert eine zufaellige Permutation
            Random rng = new Random();

            for (int j = 0; j < 10 * n; j++) {                          //为什么这里要10 * n呢?            int pos1 = rng.nextInt(n);
                int pos2 = rng.nextInt(n);

                int buf = inputValues[pos1];
                inputValues[pos1] = inputValues[pos2];
                inputValues[pos2] = buf;                                   //为什么这里要交换?
            }

            for (int i = 0; i < n; i++) {
                System.out.println("Producer: Writing value " + inputValues[i]);
                q.addValue(inputValues[i]);

                try {
                    sleep(10);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
            }
            System.out.println("Producer: "
                    + "All values successfully written to the queue");
        }

    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:23:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客3
    发贴心情 
    public class ConsumerBusyWaiting extends Thread {
        
         private final int n;
         private final Queue q;
          /** Creates a new instance of ConsumerBusyWaiting */
         public ConsumerBusyWaiting(Queue q,int numOutputValues) {
             this.n = numOutputValues;
             this.q = q;
        }
        
        public void run()
        {
            for(int i = 0;i < n;i++)
            {
                consume(q.getLowestValue());
                q.removeLowestValue();
                try
                {
                    sleep(10);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
            System.out.println("All values successlly read");
        }
        public void consume(int i)                                      //为什么这个方法可以放在后面定义呢?    {
            System.out.println("Consumer:Reading value" +i);
        }
    }
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:25:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客4
    发贴心情 
    以下的代码是要求用管程实现消费者原理,请问下面那个地方体现了管程的思想啊?

    public class ConsumerMonitor extends Thread {

        
        private final int n;
        private final Queue q;
        
        public ConsumerMonitor(Queue q ,int numOutputValues){
            this.n = numOutputValues;
            this.q = q;
        }
        public void run()
        {
            int anzahl = 0;
            while(anzahl < n)
            {
                while(q.isEmpty())
                {
                    try
                    {
                        sleep(2);
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
                }
                consume(q.getLowestValue());
                q.removeLowestValue();
                anzahl++;
            }    
            
        }
        public void consume(int i){
                 System.out.println("Consumer: Reading value" + i);
        }    
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:26:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客5
    发贴心情 
    /** An dieser Klasse duerfen keine Aenderungen vorgenommen werden. */
    public class TestBusyWaiting {

        public static final int LENGTH = 100;
        
     public static void main(String[] args) {
      Queue q = new Queue();
      ConsumerBusyWaiting c = new ConsumerBusyWaiting(q, LENGTH);
      Producer p = new Producer(q, LENGTH);
      
      c.start();
      p.start();
      
     }
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:27:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客6
    发贴心情 
    /** An dieser Klasse duerfen keine Aenderungen vorgenommen werden. */
    public class TestMonitor {

        public static final int LENGTH = 100;    
        
     public static void main(String[] args) {
      Queue q = new Queue();
      ConsumerMonitor c = new ConsumerMonitor(q, LENGTH);
      Producer p = new Producer(q, LENGTH);
      
      c.start();
      p.start();
      
     }

    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:27:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客7
    发贴心情 
    先谢谢大家啦~
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/8 6:27:00
     
     baar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:26
      积分:146
      门派:XML.ORG.CN
      注册:2006/5/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给baar发送一个短消息 把baar加入好友 查看baar的个人资料 搜索baar在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看baar的博客8
    发贴心情 
    没有人回答?自己再顶~现在想知道怎样写那个getLowestValue()的程序
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/11 0:52:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/1/3 0:39:54

    本主题贴数8,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    107.910ms