生产者,消费者问题Java实现

本文通过Java代码示例介绍了如何使用BlockingQueue来实现生产者消费者模型。具体包括BlockingQueue的主要API介绍及其实现的生产者和消费者类的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用BlockingQueue实现生产者消费者问题

BlockingQueue中API介绍

offer(E e): 将给定的元素设置到队列中,如果设置成功返回true, 否则返回false. e的值不能为空,否则抛出空指针异常。

offer(E e, long timeout, TimeUnit unit): 将给定元素在给定的时间内设置到队列中,如果设置成功返回true, 否则返回false.

add(E e): 将给定元素设置到队列中,如果设置成功返回true, 否则抛出异常。如果是往限定了长度的队列中设置值,推荐使用offer()方法。

put(E e): 将元素设置到队列中,如果队列中没有多余的空间,该方法会一直阻塞,直到队列中有多余的空间。

take(): 从队列中获取值,如果队列中没有值,线程会一直阻塞,直到队列中有值,并且该方法取得了该值。

poll(long timeout, TimeUnit unit): 在给定的时间里,从队列中获取值,如果没有取到会抛出异常。

remainingCapacity():获取队列中剩余的空间。

remove(Object o): 从队列中移除指定的值。

contains(Object o): 判断队列中是否拥有该值。

drainTo(Collection c): 将队列中值,全部移除,并发设置到给定的集合中。

消费者

package thread;

import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable
{
    BlockingQueue<String> queue;

    public Consumer(BlockingQueue<String> queue)
    {
        this.queue=queue;
    }

    @Override
    public void run()
    {
        try
        {
            String produce=queue.take();
            System.out.println("消费者消费了:"+produce);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }

    }
}

生产者

package thread;

import java.util.Date;
import java.util.concurrent.BlockingQueue;

public class Product implements Runnable
{
    static int num=0;
    BlockingQueue<String> queue;
    Date date=new Date();
    public Product(BlockingQueue<String> queue)
    {
        this.queue=queue;
    }

    @Override
    public void run()
    {

        try
        {
            String produce="物品"+num ;
            num++;
            System.out.println("生产者线程"+Thread.currentThread().getName()+produce);
            queue.put(produce);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }

    }
}

测试

package thread;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

public class Test
{
    public static void main(String[] args)
    {
        //设仓库大小为4
        BlockingQueue<String> queue=new LinkedBlockingDeque<String>(4);

        Consumer consumer=new Consumer(queue);
        Product product=new Product(queue);
        for (int i=0;i<50;i++)
        {
            new Thread(product,"生产者"+i).start();
            new Thread(consumer,"消费者"+i).start();
        }

    }

}

运行结果

生产者线程生产者0物品0
消费者消费了:物品0
生产者线程生产者1物品1
消费者消费了:物品1
生产者线程生产者2物品2
消费者消费了:物品2
生产者线程生产者3物品3
生产者线程生产者4物品4
消费者消费了:物品3
生产者线程生产者6物品5
生产者线程生产者7物品6
消费者消费了:物品4
生产者线程生产者8物品7
消费者消费了:物品5
生产者线程生产者9物品8
消费者消费了:物品6
生产者线程生产者10物品9
消费者消费了:物品7
生产者线程生产者11物品10
消费者消费了:物品8
生产者线程生产者12物品11
消费者消费了:物品9
生产者线程生产者13物品12
消费者消费了:物品10
生产者线程生产者14物品13
消费者消费了:物品11
生产者线程生产者15物品14
消费者消费了:物品12
生产者线程生产者16物品15
消费者消费了:物品13
生产者线程生产者17物品16
消费者消费了:物品14
生产者线程生产者18物品17
消费者消费了:物品15
生产者线程生产者19物品18
消费者消费了:物品16
生产者线程生产者20物品19
消费者消费了:物品17
生产者线程生产者21物品20
消费者消费了:物品18
生产者线程生产者22物品21
生产者线程生产者23物品22
生产者线程生产者24物品23
消费者消费了:物品19
消费者消费了:物品20
消费者消费了:物品22
消费者消费了:物品21
生产者线程生产者5物品24
消费者消费了:物品24
消费者消费了:物品23
生产者线程生产者48物品26
生产者线程生产者49物品25
消费者消费了:物品26
生产者线程生产者47物品27
消费者消费了:物品25
消费者消费了:物品27
生产者线程生产者46物品28
生产者线程生产者45物品29
消费者消费了:物品29
消费者消费了:物品28
生产者线程生产者44物品30
生产者线程生产者43物品31
生产者线程生产者42物品32
生产者线程生产者41物品33
消费者消费了:物品33
消费者消费了:物品30
生产者线程生产者40物品34
消费者消费了:物品32
消费者消费了:物品34
生产者线程生产者39物品35
消费者消费了:物品31
生产者线程生产者38物品36
生产者线程生产者36物品37
消费者消费了:物品36
生产者线程生产者37物品38
消费者消费了:物品37
生产者线程生产者35物品39
消费者消费了:物品38
消费者消费了:物品35
生产者线程生产者33物品41
消费者消费了:物品39
生产者线程生产者32物品42
生产者线程生产者34物品40
消费者消费了:物品42
生产者线程生产者30物品43
生产者线程生产者29物品44
消费者消费了:物品44
生产者线程生产者28物品45
消费者消费了:物品41
消费者消费了:物品45
消费者消费了:物品43
消费者消费了:物品40
生产者线程生产者27物品49
生产者线程生产者31物品48
消费者消费了:物品49
生产者线程生产者25物品47
消费者消费了:物品48
生产者线程生产者26物品46
消费者消费了:物品47
消费者消费了:物品46

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值