快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

使用BlockingQueue怎么实现阻塞队列

这篇文章将为大家详细讲解有关使用BlockingQueue怎么实现阻塞队列,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了大姚免费建站欢迎大家使用!

使用BlockingQueue怎么实现阻塞队列

使用BlockingQueue怎么实现阻塞队列

使用BlockingQueue怎么实现阻塞队列

使用BlockingQueue怎么实现阻塞队列

使用BlockingQueue怎么实现阻塞队列

package com.shi.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 阻塞队列
 * @author shiye
 *
 */
public class TestBlockQueue {

	public static void main(String[] args) throws InterruptedException {
		//定义一个长度为3的阻塞队列
		BlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
		
		System.out.println("----------------抛出异常的 情况----------------------");
//		blockingQueue.add("aa");
//		blockingQueue.add("bb");
//		blockingQueue.add("cc");
		//blockingQueue.add("dd");//如果队列满了 Exception java.lang.IllegalStateException: Queue full
		
//		System.out.println(blockingQueue.element());//检查队列头的信息 : aa
		
//		blockingQueue.remove();
//		blockingQueue.remove();
//		blockingQueue.remove();
		//blockingQueue.remove();//如果队列为空 Exception java.util.NoSuchElementException
		
		//System.out.println(blockingQueue.element());//如果队列为空  Exception java.util.NoSuchElementException
		
		System.out.println("----------------返回true/false----------------------");
//		System.out.println(blockingQueue.offer("11"));//插入队列	true
//		System.out.println(blockingQueue.offer("22"));//插入队列	true
//		System.out.println(blockingQueue.offer("33"));//插入队列	true
//		System.out.println(blockingQueue.offer("44"));//插入队列	false
//		
//		System.out.println(blockingQueue.peek());//检查队列头元素  11
//		
//		System.out.println(blockingQueue.poll());//输出队列	11
//		System.out.println(blockingQueue.poll());//输出队列	22
//		System.out.println(blockingQueue.poll());//输出队列	33
//		System.out.println(blockingQueue.poll());//输出队列	null
		
		System.out.println("----------------队列阻塞等待----------------------");
//		blockingQueue.put("zhangsan");
//		blockingQueue.put("lisi");
//		blockingQueue.put("wangwu");
//		//blockingQueue.put("shiye");//线程一直等待无法关闭
//		
//		blockingQueue.take();
//		blockingQueue.take();
//		blockingQueue.take();
		//blockingQueue.take();//线程一直等待  无法响应
		
		System.out.println("----------------队列等待一定时间之后就退出----------------------");
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//true
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//true
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//true
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//false 等待2s钟之后就退出
		
		
	}

}

SynchronousQueue

package com.shi.queue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;

/**
 * 不存储数据的队列,即生产一个消费一个的队列
 * @author shiye
 *
 *结果:
	AA	 存放1 ...
	BB	 get 1
	AA	 存放2 ...
	BB	 get 2
	AA	 存放3 ...
	BB	 get 3
 */
public class TestSynchroniousQueue {

	public static void main(String[] args) {
		BlockingQueue blockingQueue = new SynchronousQueue<>();
		
		new Thread(()-> {
			try {
				System.out.println(Thread.currentThread().getName()+ "\t 存放1 ..." );
				blockingQueue.put("1");
				
				System.out.println(Thread.currentThread().getName()+ "\t 存放2 ..." );
				blockingQueue.put("2");
				
				System.out.println(Thread.currentThread().getName()+ "\t 存放3 ..." );
				blockingQueue.put("3");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		},"AA").start();
		
		
		new Thread(()-> {
			try {
				Thread.sleep(5000);//睡眠5秒
				System.out.println(Thread.currentThread().getName() + "\t get " + blockingQueue.take());
			
				Thread.sleep(5000);//睡眠5秒
				System.out.println(Thread.currentThread().getName() + "\t get " + blockingQueue.take());
				
				Thread.sleep(5000);//睡眠5秒
				System.out.println(Thread.currentThread().getName() + "\t get " + blockingQueue.take());

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		},"BB").start();
		
	}

}

综合案例(使用阻塞队列实现生产者消费者问题)

package com.shi.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 	通过阻塞队列的方式 实现  生产者 消费者 问题
 * @author shiye
 *	使用到的技术:
 *	countDownLatch:闭锁
 *	volatile 自旋锁
 *	AtomicInteger 原子整型
 *	BlockingQueue 阻塞队列
 *	
 */
public class TestProducterAndConsumterByQueue {

	public static void main(String[] args) throws InterruptedException {
		
		//闭锁
		final CountDownLatch countDownLatch = new CountDownLatch(11);
		
		Check check = new Check(new ArrayBlockingQueue<>(3));
		
		//创建线程生产 (启动10个线程去生产)
		for (int i = 0; i < 10; i++) {
			new Thread(()->{
				System.out.println(Thread.currentThread().getName() + "\t 生产者启动...");
				try {
					check.productor("aaa");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				countDownLatch.countDown();//线程数量减一
			},"AA-"+i).start();
		}
		
		
		
		//创建1 个线程消费
		new Thread(()->{
			System.out.println(Thread.currentThread().getName() + "\t 消费者启动...");
			try {
				check.consumter();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			countDownLatch.countDown();//线程数量减一
		},"BB").start();
		
		Thread.sleep(5000);//等待5秒 停止
		check.stop();
		
		countDownLatch.await();//等待上面的线程全部执行完毕,才检查产品数量
		System.out.println("5s之后线程停止,总共生产了:"+ check.getTotle() +"件产品");
	}

}

//店员
class Check{
	private volatile boolean FLAG = true;//标志位
	private AtomicInteger atomicInteger = new AtomicInteger();//统计总数的变量
	
	private BlockingQueue blockingQueue = null;//定义一个阻塞队列
	
	public Check(BlockingQueue blockingQueue) {
		this.blockingQueue = blockingQueue;
		System.out.println("创建一个 "+blockingQueue.getClass().getName()+" 实例");
	}
	
	//生产者
	public void productor(String num) throws InterruptedException {
		while(FLAG) {
			System.out.println( Thread.currentThread().getName() + "\t 生产者生产数据:" + num + "到队列中...");
			blockingQueue.offer(num,2l,TimeUnit.SECONDS); //延迟2s插入数据到队列中。。
			Thread.sleep(1000);//线程睡眠1s
			atomicInteger.getAndIncrement();//让总数自加1
		}
	}
	
	//消费者
	public void consumter() throws InterruptedException {
		while(FLAG) {
			Object object = blockingQueue.poll(2, TimeUnit.SECONDS);//最多消费延迟2s
			if(object != null) {
				System.out.println( Thread.currentThread().getName() + "\t 消费者消费数据:" + object);
			}
		}
	}
	
	//停止
	public void stop() {
		FLAG = false;
	}
	
	public int getTotle() {
		return atomicInteger.get();
	}
}

关于使用BlockingQueue怎么实现阻塞队列就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


网站标题:使用BlockingQueue怎么实现阻塞队列
网站URL:http://6mz.cn/article/ipsooj.html

免费获取网站建设与品牌策划方案报价

*主要业务范围包括:高端网站建设, 集团网站建设(网站建设网站制作)找网站建设公司就上快上网。
提交需求

    联系我们

    028-86922220
  • 手机:13518219792
  • 地址:成都市太升南路288号锦天国际A幢1002号
  • 24小时服务热线:400-028-6601

    网站建设服务

  • 网页设计
  • 网站制作
  • 网站开发

    网站推广服务

  • 营销网站建设
  • 百度快速排名
  • 整站网站推广

    网站运维服务

  • 基础维护
  • 网站改版
  • 网站维护

    FOLLOW US

  • 微信二维码

    微信二维码

Copyright © 2022 成都快上网科技有限公司 成都网站建设公司-选网站建设公司快上网!国内专业的网站制作公司!
All Rights Reserved 版权所有 蜀ICP备19037934号-11