Boundedbuffer

本文介绍了BoundedBuffer中put和take方法的使用方式及其应用场景。当数据通过广播发送并接收后,利用put方法将数据存入Objectobject,take方法则在指定阻塞时间内取出数据,若超时未获取数据则返回null。

Boundedbuffer

public void put(int key,Object object)以及public Object take(int key,int outtime)方法用法及解释

从本地把数据发送到(通过广播)超级服务,超级服务对数据进行操作(例如加密)之后会把数据返回到(也是通过广播)本地,本地接收到数据之后,通过put方法,把数据存到Object object中,存好了之后,take方法会把put进去的数据取出来,前提是必须在阻塞时间outtime之内,不然take取出来的数据就为null。

阻塞时间outtime:表示程序运行到take(int key,int outtime)时,此线程最多等待的时间。如果outtime为10000ms,而在2000ms之后就把数据put到object中,那么take就会立马把object取出来,然后继续take方法之后的操作,此种情况之下,总共只等了2000s,没有等10000ms;如果是在10000ms时还没有执行数据的put操作,那么take还是会去取数据,取完之后继续take方法之后的操作,但只是取出来的是object等于null。这就好像朋友打电话叫你等她一起去吃饭,你和她说,我最多等你20分钟,如果她第十分钟的时候出现了,那么你们就可以在第十分钟的时候继续下一步操作,也就是去吃饭;如果她在第二十分钟还没出现,那么你就没有继续再等她,而是一个人先去吃饭了。


import java.util.concurrent.Semaphore; // 有界缓冲区类(模拟缓冲池) class BoundedBuffer { private final int N; // 缓冲区大小 private int[] buffer; // 缓冲区数组 private int in = 0, out = 0; // 生产者/消费者指针 // 信号量:控制空缓冲区、满缓冲区、互斥访问 private Semaphore empty; private Semaphore full; private Semaphore mutex; // 构造方法初始化缓冲区和信号量 public BoundedBuffer(int size) { N = size; buffer = new int[N]; empty = new Semaphore(N); // 初始空缓冲区数为N full = new Semaphore(0); // 初始满缓冲区数为0 mutex = new Semaphore(1); // 互斥锁初始为1 } // 生产者放入产品 public void produce(int item) throws InterruptedException { empty.acquire(); // 获取空缓冲区(若无则阻塞) mutex.acquire(); // 互斥访问缓冲区 // 放入产品到缓冲区 buffer[in] = item; System.out.println(Thread.currentThread().getName() + " 生产:" + item + ",存入位置 " + in + ",剩余空缓冲区:" + (empty.availablePermits() + 1)); in = (in + 1) % N; // 指针循环 mutex.release(); // 释放互斥锁 full.release(); // 满缓冲区数+1 } // 消费者取出产品 public int consume() throws InterruptedException { full.acquire(); // 获取满缓冲区(若无则阻塞) mutex.acquire(); // 互斥访问缓冲区 // 从缓冲区取出产品 int item = buffer[out]; System.out.println(Thread.currentThread().getName() + " 消费:" + item + ",取出位置 " + out + ",剩余满缓冲区:" + (full.availablePermits() - 1)); out = (out + 1) % N; // 指针循环 mutex.release(); // 释放互斥锁 empty.release(); // 空缓冲区数+1 return item; } } // 生产者线程类 class Producer implements Runnable { private final BoundedBuffer buffer; private final int producerId; public Producer(BoundedBuffer buffer, int id) { this.buffer = buffer; producerId = id; } @Override public void run() { try { for (int i = 1; i <= 5; i++) { // 每个生产者生产5个产品 int product = (int) (Math.random() * 100); // 随机产品(0-99) buffer.produce(product); Thread.sleep((int) (Math.random() * 1000)); // 模拟生产耗时 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } // 消费者线程类 class Consumer implements Runnable { private final BoundedBuffer buffer; private final int consumerId; public Consumer(BoundedBuffer buffer, int id) { this.buffer = buffer; consumerId = id; } @Override public void run() { try { for (int i = 1; i <= 5; i++) { // 每个消费者消费5个产品 int product = buffer.consume(); Thread.sleep((int) (Math.random() * 1500)); // 模拟消费耗时 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } // 主程序(测试入口) public class ProducerConsumerExperiment { public static void main(String[] args) { // 设置缓冲区大小为3(可调整) BoundedBuffer buffer = new BoundedBuffer(3); // 创建生产者和消费者线程(各2个) new Thread(new Producer(buffer, 1), "生产者-1").start(); new Thread(new Producer(buffer, 2), "生产者-2").start(); new Thread(new Consumer(buffer, 1), "消费者-1").start(); new Thread(new Consumer(buffer, 2), "消费者-2").start(); } }详细解析这段代码讲给老师听
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值