当前位置: 首页 > wzjs >正文

做网站流量怎么赚钱吗威海网站定制

做网站流量怎么赚钱吗,威海网站定制,网站设计的需求,一个新手如何做网站在多线程编程中,阻塞队列是一种非常有用的工具,它可以在生产者和消费者之间提供一个缓冲区,使得生产者可以往队列中添加数据,而消费者可以从队列中取出数据。当队列满时,生产者会被阻塞直到有空间可用;当队…

在多线程编程中,阻塞队列是一种非常有用的工具,它可以在生产者和消费者之间提供一个缓冲区,使得生产者可以往队列中添加数据,而消费者可以从队列中取出数据。当队列满时,生产者会被阻塞直到有空间可用;当队列空时,消费者会被阻塞直到有数据可用。本文将详细分析一个基于数组实现的阻塞队列代码。

代码结构概述

我们先来浏览一下整个代码的结构:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class ArrBlockQueue<E> {// 成员变量private Object[] arr;private int size = 0;private int head = 0;  // 存数据位置private int last = 0;  // 取数位置private ReentrantLock lock = new ReentrantLock();private Condition notEmpty = lock.newCondition();private Condition notFull = lock.newCondition();// 构造函数public ArrBlockQueue(int len) {arr = new Object[len];}// 添加数据方法public void put(E e) throws InterruptedException {lock.lock();try {while (size == arr.length) {notFull.await();}System.out.println("put 添加数据 " + e);arr[head] = e;head = (head + 1) % arr.length;size++;notEmpty.signal();} finally {lock.unlock();}}// 取出数据方法(未完成)public E take() throws InterruptedException {}// 获取队列大小方法public int size() {lock.lock();try {return size;} finally {lock.unlock();}}// 主方法(测试用)public static void main(String[] args) {// 测试代码}
}

关键组件解析

1. 同步控制部分

private ReentrantLock lock = new ReentrantLock();
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();

这里使用了ReentrantLockCondition来实现同步控制:

  • ReentrantLock:这是一个可重入的互斥锁,它可以替代synchronized关键字提供更灵活的锁定机制。在这里,它用于确保对共享资源的独占访问。

  • Condition:这是ReentrantLock的一个条件变量接口,用于实现复杂的等待/通知机制。在这里,我们创建了两个条件变量:

    • notEmpty:用于通知消费者队列已非空,可以取数据了。
    • notFull:用于通知生产者队列已非满,可以添加数据了。

2. 数据存储部分

private Object[] arr;
private int size = 0;
private int head = 0;  // 存数据位置
private int last = 0;  // 取数位置

这是阻塞队列的核心数据结构:

  • arr:一个对象数组,用于存储队列中的元素。
  • size:当前队列中的元素数量。
  • head:指向队列头部(下一个要添加元素的位置)。
  • last:指向队列尾部(下一个要取出元素的位置)。

3. 添加数据方法

public void put(E e) throws InterruptedException {lock.lock();try {while (size == arr.length) {notFull.await();}System.out.println("put 添加数据 " + e);arr[head] = e;head = (head + 1) % arr.length;size++;notEmpty.signal();} finally {lock.unlock();}
}

这是生产者线程调用的方法:

  • lock.lock():获取锁,确保线程安全。

  • while (size == arr.length):检查队列是否已满。如果队列满了,调用notFull.await()使当前线程进入等待状态,直到队列有空间可用。

  • 添加数据到arr数组的head位置,更新head指针,并增加size计数。

  • notEmpty.signal():通知可能正在等待队列非空的消费者线程,队列已经可以取出数据了。

  • lock.unlock():释放锁。

代码运行示例

main方法中,创建了一个长度为5的阻塞队列实例:

ArrBlockQueue<Integer> block = new ArrBlockQueue<>(5);

启动两个线程:

  1. 一个生产者线程,循环添加10个元素到队列中:
new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ": put 线程启动!");for (int i = 0; i < 10; i++) {try {block.put(i);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}).start();
  1. 一个消费者线程,循环从队列中取出10个元素:
new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ": take 线程启动!");for (int i = 0; i < 10; i++) {try {Thread.sleep(500);System.out.println(block.take());} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}).start();

总结

这个基于数组的阻塞队列实现展示了如何使用ReentrantLockCondition来实现复杂的等待/通知机制。它为生产者和消费者模式提供了一个线程安全的解决方案,确保了数据的一致性和线程间的高效协作。理解这种实现方式有助于我们更好地掌握Java并发编程的核心概念。


文章转载自:

http://eNpAiqdP.bzgpj.cn
http://ppWazFUt.bzgpj.cn
http://e5UHpN3x.bzgpj.cn
http://JMOX2h9Z.bzgpj.cn
http://LEvDM5rc.bzgpj.cn
http://iw36Xw47.bzgpj.cn
http://FDoQ2UtO.bzgpj.cn
http://hGELhIeZ.bzgpj.cn
http://tqkG1ION.bzgpj.cn
http://p1M2MnH6.bzgpj.cn
http://TGkftJgY.bzgpj.cn
http://BemzwkTG.bzgpj.cn
http://F4RDAQ2f.bzgpj.cn
http://9iDsztut.bzgpj.cn
http://zjxvlLiv.bzgpj.cn
http://X4mcGRuW.bzgpj.cn
http://ZTg4adCy.bzgpj.cn
http://1kspR5lh.bzgpj.cn
http://KCjPbs43.bzgpj.cn
http://YbouCPKe.bzgpj.cn
http://2PiML5YJ.bzgpj.cn
http://UMpcXpy5.bzgpj.cn
http://3e65c3Nc.bzgpj.cn
http://lQppTbkM.bzgpj.cn
http://y5k70aWa.bzgpj.cn
http://En1WPVib.bzgpj.cn
http://9TZgGEDL.bzgpj.cn
http://JJBtDJfc.bzgpj.cn
http://GR2SL7E9.bzgpj.cn
http://InqaGWE0.bzgpj.cn
http://www.dtcms.com/wzjs/671821.html

相关文章:

  • 较成功营销网站的例子南昌官网seo
  • 网站适合用angular做吗注册个人公司需要什么条件
  • 免费的黄冈网站有哪些平台?老铁外链
  • 衡阳网站建设公司电话时事新闻最新消息
  • 西部数码网站打不开韩国虚拟空间网站
  • 网站建设怎么打广告北京百度推广排名优化
  • 企业网站建设可行性分析 技能训练自学网页设计的网站
  • 贵州建设官方网站网站 国际化
  • 自适应网站建站网站功能介绍是什么
  • 自己如何创建一个网站精美图表网站推荐
  • 有哪些网站做电子元器件比较好专门做酒的网站
  • 网站icp备案是什么意思工作室暴利项目
  • 郴州网站建设网站网上注册公司需要多长时间
  • 江苏省建设工程网站做餐厅网站的需求分析
  • 公司网站公司简介宣传夸大受处罚网站底部版权信息字体颜色
  • 现今网站开发的主流框架外链seo推广
  • 绥化北京网站建设微商网络推广怎么做
  • 通辽大柒网站建设有限公司华为弹性云做网站
  • 贪玩原始传奇官方网站网站建设跟版网
  • 网站开发技术有包括简易做网站的软件
  • 商品网站源码wordpress主题 网络公司
  • 百度软件下载中心官方网站苏州正规网站建设概况
  • .net 电子商务网站源码在线单页网站制作
  • 邯郸集团网站建设魔客吧wordpress主题安装
  • 怎样建设自己网站的后台wordpress敏感词
  • 怎么做网络乞丐网站制作可以赚钱的网站
  • 十堰微网站建设价格简述网站建设流程
  • 天津企业网站做推广可以上那些网站
  • 网站重新安装学校网站手机站的建设方案
  • 哪种网站名称容易通过备案审核济南网站建设有限公司