Java 多线程 简单实例 (消费者与生成者)的关系

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();//开启消费线程

    }

}

 

你可能感兴趣的:(java 多线程)