shibazi

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习;

PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧!

1.定义生产消费环境

package second;

public class Queue {
    int value = 0;
    boolean isEmpty = true;
    /**
     * 生产者
     * @param v
     */
    public synchronized void put(int v){
        if(!isEmpty){//如果存在数据没有被消费
            try{
                System.out.println("生产者等待...");
                wait();
            }catch(Exception e){
                
            }
        }
        value ++;//本次生产1个
        isEmpty = false;//设置为false(代表有东西了可以消费了)
        System.out.println("生产者共生产数量:" + v);
        notify();//通知消费者开始消费
    }
    
    public synchronized int get(){
        //如果消费数据没有了,消费者继续等...
        if(isEmpty){
            try{
                System.out.println("消费者等待...");
                wait();
            }catch(Exception e){
                
            }
        }
        value --;
        if(value < 1){
            isEmpty = true;//如果消费完了,则设置为true
        }
        System.out.println("消费者消费一个,剩余:"+value);
        notify();
        return value;
    }
}

2.生产者

package second;

public class Producer extends Thread {
    Queue q;
    Producer(Queue q){
        this.q = q;
    }
    public void run(){
        for(int i=1;i<5;i++){//循环生产5次
            q.put(i);
        }
    }
}

3.消费者

package second;

public class Consumer extends Thread {
    Queue q;
    Consumer(Queue q){
        this.q = q;
    }
    public void run(){
        while(true){//永远的消费下去,直到不再生产为止
            q.get();
        }
    }
}

4.线程调用

package second;

public class Cao {
    public static void main(String[] args){
        Queue q = new Queue();//实例消费&生成工厂
        Producer p = new Producer(q);//将工厂传入给生产者
        Consumer c = new Consumer(q);//将工厂传入给消费者
        p.start();//开启生成线程
        c.start();//开启消费线程
    }
}

 

posted on 2014-07-15 14:48  一生学习,何来毕业  阅读(339)  评论(0编辑  收藏  举报