Java实现生产者消费者问题

方法1:使用LinkedBlockingQueue


import java.util.Queue;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
public class ProviderConsumerTest{
    public static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
    public static void main(String[] ar){
        Provider p1=new Provider();
        Provider p2=new Provider();
        Consumer c1=new Consumer();
        Consumer c2=new Consumer();
        Thread tp1=new Thread(p1);
        Thread tp2=new Thread(p2);
        Thread tc1=new Thread(c1);
        Thread tc2=new Thread(c2);
        tp1.setName("Provider1");
        tp2.setName("Provider2");
        tc1.setName("Consumer1");
        tc2.setName("Consumer2");
        tp1.start();
        tp2.start();
        tc1.start();
        tc2.start();

    }
}
class Provider implements Runnable{
    Random random=new Random();
    public void run(){
        for(int i=0;i<5;i++){
                try{
                    int data=random.nextInt();
                ProviderConsumerTest.queue.put(data);
                System.out.println(Thread.currentThread().getName()+" provide "+data);
                Thread.sleep(1000);
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                }
        }
    }
}
class Consumer implements Runnable{
    Random random=new Random();
    Integer data;
    public void run(){
        for(int i=0;i<5;i++){
            try{
                data=ProviderConsumerTest.queue.take();
                System.out.println(Thread.currentThread().getName()+" consume "+data);
                Thread.sleep(1000);
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

方法2:进程之间的通信

测试类:

package Demo6;

import java.util.LinkedList;
import java.util.Queue;

public class ConsumerProducer {//测试类不宜含有自己的变量
    public static void main(String[] args) {
        Object obj=new Object();
        Queue<Integer>queue=new LinkedList<>();
        Consumer consumer=new Consumer(obj,queue);
        Producer producer=new Producer(obj,queue);
        Thread thread1=new Thread(consumer);
        Thread thread2=new Thread(producer);
        thread1.start();
        thread2.start();
    }

}

消费者

package Demo6;

import java.util.Queue;

public class Consumer implements  Runnable{
    Object obj;
    Queue<Integer>queue;

    public Consumer(Object obj, Queue<Integer> queue) {
        this.obj = obj;
        this.queue = queue;
    }

    @Override
    public void run() {
        int i=0;
        while (i<10){
            synchronized (obj){
                if(!queue.isEmpty()){
                    System.out.println(" 已经消费"+queue.poll());
                    i++;
                    obj.notify();
                }
                else{
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

生产者:

package Demo6;

import java.util.Queue;

public class Producer implements Runnable {
    Object obj;
    Queue<Integer> queue;

    public Producer(Object obj, Queue<Integer> queue) {
        this.obj = obj;
        this.queue = queue;
    }

    @Override
    public void run() {
        int i = 0;
        while (i < 10)
            synchronized (obj) {
                if (queue.isEmpty()) {

                    i++;
                    queue.add(i);
                    System.out.println("已经生产"+i);
                    obj.notify();
                } else {
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值