| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 543 人关注过本帖
标题:遇到难题了,请帮我看看为什么要这么用?有关线程的难题
只看楼主 加入收藏
初学者5
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2013-8-9
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:1 
遇到难题了,请帮我看看为什么要这么用?有关线程的难题
public class TestPC {
    public static void main(String[] args){
        SynStack ss=new SynStack();
        Producer p=new Producer(ss);
        Consumer  c=new Consumer(ss);
        Thread t1=new Thread(p);
        t1.start();
        Thread t2=new Thread(c);
        t2.start();
    }

}
 class SynStack {                           
   
    private String[] date=new String[6];
    private int cnt=0;
    public synchronized void push(String ch){
        while(cnt==date.length){
            try{
            this.wait();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        this.notify();
        date[cnt]=ch;
        System.out.println("生产完成第"+(cnt+1)+"个商品"+date[cnt]);
        ++cnt;
    }
    public synchronized String pop(){                     
        while(cnt==0){
            try{
            this.wait();
        }catch(Exception x){
            x.printStackTrace();
        }
        }
        this.notify();
        --cnt;
        return date[cnt];
    }

}
 class Producer implements Runnable{        
        private SynStack ss=null;
        public Producer(SynStack ss){
            this.ss=ss;
        }
        public void run(){                     
            String  ch;
            
            for(int i=0;i<20;i++){
                ch="商品"+(i+1);
            ss.push(ch);
            }
        }

    }
class Consumer implements Runnable{
        
        private SynStack ss=null;
        
        public Consumer(SynStack ss){
            this.ss=ss;
            
        }
         public void run() {                           
             for(int i=0;i<20;i++){
                 System.out.println("消费完一个商品"+ss.pop());
             }
               
         
         }

        
        

    }
为是SynStack的类中两个方法中一定要用while而不用if呢?还有this.wait()中的this是指什么 ?this.wait被 叫醒后,为什么马上就是运行while外面的?
搜索更多相关主题的帖子: private public 
2013-08-20 22:19
a535182324
Rank: 2
等 级:论坛游民
帖 子:21
专家分:35
注 册:2013-3-5
收藏
得分:10 
类似于生产者与消费者问题,在生产者和消费者的类中通过循环进行持续的生产或消费的
1.if语句在执行后会执行下面的语句(只会进行一次的判断),也就是说不论是什么情况下都会执行if语句下面的语句,那么就无法做到控制生产与消费的问题。
2.this代表当前调用函数的对象
3.其实在这里是模拟的唤醒,也就是说当while中的条件满足是就wait,不满足就执行循环外面的语句。
2013-08-21 15:12
快速回复:遇到难题了,请帮我看看为什么要这么用?有关线程的难题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041728 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved