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

凡科建设网站怎么保存外贸网站建设有什么需要注意的吗

凡科建设网站怎么保存,外贸网站建设有什么需要注意的吗,佛山电脑培训班哪里有,wordpress4.4.2文章目录 1. 什么是堵塞队列?2. 堵塞队列的方法3. 生产者消费者模型4. 自己实现堵塞队列 1. 什么是堵塞队列? 堵塞队列也是队列,故遵循先进先出的原则。但堵塞队列是一种线程安全的数据结构,可以避免线程安全问题,当队…

文章目录

    • 1. 什么是堵塞队列?
    • 2. 堵塞队列的方法
    • 3. 生产者消费者模型
    • 4. 自己实现堵塞队列

1. 什么是堵塞队列?

堵塞队列也是队列,故遵循先进先出的原则。但堵塞队列是一种线程安全的数据结构,可以避免线程安全问题,当队列为空时,继续出队列会发生堵塞,直至其他线程有元素进队列。当队列满时,继续入队列会堵塞,直至其他线程有元素出队列。
生产者消费者模型就是最经典的堵塞队列模型之一。

2. 堵塞队列的方法

Java标准库里含有堵塞队列,我们使用时可以直接使用标准库即可。

  • BlockingQueue是个接口,真正实现的类是:LinkedBlockingQueue。
  • put方法入队列,take方法出队列,具有堵塞性。
  • peek,offer,poll等方法也可以使用,但是不具有堵塞性。
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
queue.put();
queue.take();

3. 生产者消费者模型

这是一个常见的并发编程模型,用于协调生产者和消费者之间的工作,在这个模型中,一个线程负责生产元素,一个线程负责消费元素。
它也是一个堵塞队列 ,所以具有堵塞队列的特性。

public class Test {public static void main(String[] args) {BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();//t1线程负责生产元素Thread t1 = new Thread(() -> {try{Random random = new Random();while (true){int i = random.nextInt();System.out.println("生产元素: " + i);queue.put(i);Thread.sleep(1000);}}catch (InterruptedException e){e.printStackTrace();}});//t2负责消费元素Thread t2 = new Thread(() -> {try {while(true){int i = queue.take();System.out.println("消费元素: " + i);}} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();}
}

运行结果:
1

4. 自己实现堵塞队列

自己实现堵塞队列需要满足:

  • 通过循环队列来实现;
  • 使用synchronized实现加锁,进行同步;
  • put 插入元素的时候, 判定如果队列满了, 就进行 wait. (注意, 要在循环中进行 wait. 被唤醒时不一定队列就不满了, 因为同时可能是唤醒了多个线程);
  • take 取出元素的时候, 判定如果队列为空, 就进行 wait. (也是循环 wait) ;
class BlockingQueue{//定义一个数组private int[] arr;//数组中元素个数private int size = 0;//记录数组头的位置private int read = 0;//记录尾的位置private int tail = 0;//锁Object lock = new Object();//构造方法,确定数组大小public BlockingQueue(int i){arr = new int[i];}//入队列public void put(int value){try{//加锁,保证线程安全synchronized (lock){//使用while,不要使用if,否则notifyAll时,所有等待线程都被唤醒,造成线程安全while(arr.length == size){lock.wait();}arr[tail] = value;//循环队列tail = (tail + 1) % arr.length;//添加一个元素,size加一次size++;//唤醒所有线程lock.notifyAll();}}catch (InterruptedException e){e.printStackTrace();}}public int take() {//返回值,不能写在try里面int value = 0;try {//上锁synchronized (lock) {//队列为0,等待,使用whilewhile (size == 0) {lock.wait();}//赋返回值value = arr[read];//循环read = (read + 1) % arr.length;//出队列一个,减一个size--;//唤醒lock.notifyAll();}} catch (InterruptedException e) {e.printStackTrace();}//返回值return value;}}
public class Test4 {public static void main(String[] args) throws InterruptedException {BlockingQueue queue = new BlockingQueue(10);Thread t1 = new Thread(() -> {try{Random random = new Random();while (true){int value = random.nextInt(100);System.out.println("生产元素: " + value);queue.put(value);Thread.sleep(100);}}catch (InterruptedException e){e.printStackTrace();}});//t2负责消费元素Thread t2 = new Thread(() -> {while(true){int value = queue.take();System.out.println("消费元素: " + value);}});t1.start();Thread.sleep(2000);t2.start();}
}

1111
1 因为t2 未启动,所以只能生产元素,当生产10个元素后,队列满了,进入堵塞,等待被唤醒;
2 因为t1生产时,每次都会休眠,线程执行非常迅速,所以队列一直出元素,直到队列为空,进入堵塞,等待被唤醒;
3生产一个元素消费一个元素。

http://www.yayakq.cn/news/697217/

相关文章:

  • 建网站什么框架wordpress更改图片上传路径
  • 网站虚拟主机公司wordpress shopme
  • 领卷网站怎么做开封 网站建设
  • 网站开发 怎样做费用结算泰安网络电视
  • 盐城市建设工程网站自学小程序开发需要学多久
  • 营销型网站建设怎么收费服务之家做网站简单吗
  • 12380网站建设存在的问题高清视频服务器
  • 菠菜网站的代理怎么做的网站建设公司北京华网天下实惠
  • 经营网站备案信息专业免费网站建设
  • 网站文章列表和图片列表排版切换代码wordpress导航调用代码
  • 网站建站工具有哪些企业查询宝在线查询
  • 易讯网站建设兰州网站建设索q479185700
  • 雄安建站服务深圳龙华有几个区
  • 做嗳啪啪 网站网站搭建教室
  • 做标签网站是干嘛的内江 网站建设
  • 网站做适配定西市建设厅官方网站
  • 企业网站开发韵茵建站牛商网做网站要多少钱
  • 做网站首选什么语言浙江省建设厅继续教育网站首页
  • 搜索引擎友好的网站有哪些特点吉林市 网站建设
  • 房地产企业网站开发加强学校网站建设的必要性
  • 网站sem托管下载免费ppt模板
  • 医院加强网站建设综合社区网站开发费用
  • 公司网站设计与制百度收录提交查询
  • 免费做直播网站网站服务器空间不足
  • 制作购物网站需要多少钱深圳个性化网站建设公司电话
  • 学校网站建设项目需求报告建设摩托车官网旗舰店
  • 手机怎么搭建属于自己的网站wordpress的文章多重筛选
  • WordPress渗透思路wordpress 分页seo
  • 静安免费网站制作网站收录网
  • 河北高端网站设计公司创建网站基本流程