前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阻塞队列的实现

阻塞队列的实现

作者头像
shengjk1
发布2020-11-09 18:37:08
5380
发布2020-11-09 18:37:08
举报
文章被收录于专栏:码字搬砖码字搬砖

之前看到 ArrayBlockQueue 的实现,感觉挺有意思的,自己也实现一个阻塞队列,通过等待通知的方式,直接上代码

代码语言:javascript
复制
package thread;

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author shengjk1
 * @date 2020/11/4
 */
// 实现一个阻塞队列
public class MyBlockQueue<T> {
	final private LinkedList<T> lists = new LinkedList<>();
	final private int MAX = 100;
	
	private Lock lock = new ReentrantLock();
	private Condition producer = lock.newCondition();
	private Condition consumer = lock.newCondition();
	
	public static void main(String[] args) {
		MyContainer<String> c = new MyContainer<>();
		//启动消费者线程
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				for (int j = 0; j < 50; j++) {
					System.out.println(c.get());
				}
				;
			}, "c" + i).start();
		}
		
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

//		//启动生产者线程
		for (int i = 0; i < 2; i++) {
			new Thread(() -> {
				for (int j = 0; j < 250; j++) c.put(Thread.currentThread().getName() + " " + j);
			}, "p" + i).start();
		}
	}
	
	public void put(T t) {
		lock.lock();
		try {
			while (lists.size() == MAX) {
				producer.await();
			}
			lists.add(t);
			//通知所有消费者消费
			consumer.signalAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public T get() {
		T t = null;
		lock.lock();
		try {
			while (lists.size() == 0) {
				consumer.await();
			}
			t = lists.removeFirst();
			producer.signalAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
		return t;
	}
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com