前阵子学习了多线程,现在进行总结一下,模拟队列。

  分析问题:

  (1)首先需要一个容器存放元素,这里用linkedList队列。

  (2)每次像容器中添加或删除元素的时候需要计数,所以这里需要一个计数器,这里用原子类的atomicInter实现。

  (3)需要三个方法,一个put()方法,向容器中推数据,一个take()方法,向容器中取数据,一个size()方法,返回当前容器的大小。

  实现代码如下:

public class MyQueue {
//队列
private volatile LinkedList<Object> linkedList=new LinkedList<Object>();
//队列最大数
private int maxSize;
//队列最小数
private int minSize=0;
//计数器
private AtomicInteger count=new AtomicInteger(0);
//创建锁
private Object lock=new Object();
//初始化队列大小
public MyQueue(int maxSize){
this.maxSize=maxSize;
}
//返回当前队列的大小
public int getSize(){
return count.get();
}
//向队列添加元素方法
public void put(Object obj){
synchronized(lock){
if(getSize()==maxSize){
System.out.println("线程进入put方法中,阻塞中...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
linkedList.add(obj);
count.getAndIncrement();
System.out.println("向队列中添加元素:"+obj);
lock.notify();//当容器大小为minSize时,且线程进行take操作时,执行了wait方法,进入了阻塞状态,所以添加完数据应该唤醒线程,进行数据take操作
}
}
//向队列中取出元素
public Object take(){
Object temp="";
synchronized(lock){
if(getSize()==minSize){
System.out.println("线程进入take方法中,阻塞中...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
temp=linkedList.removeFirst();
count.getAndDecrement();
System.out.println("被取出的元素为:"+temp);
lock.notify();//当容器大小为maxSize时,且线程进行put操作时,执行了wait方法,进入了阻塞状态,所以取完数据应该唤醒线程,进行数据put操作
}
return temp;
} public static void main(String []args){
//初始化容器
final MyQueue myQueue=new MyQueue(5);
myQueue.put("A");
myQueue.put("B");
myQueue.put("C");
myQueue.put("D");
myQueue.put("E");
Thread t1=new Thread(new Runnable() {
public void run() {
myQueue.put("F");
}
},"t1");
Thread t2=new Thread(new Runnable() {
public void run() {
myQueue.take();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t2");
Thread t3=new Thread(new Runnable() {
public void run() {
myQueue.take();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t3");
Thread t4=new Thread(new Runnable() {
public void run() {
myQueue.put("G");
}
},"t4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}

  

多线程-模拟阻塞queue队列的更多相关文章

  1. Java多线程——可阻塞的队列BlockingQueue

    阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量. ArrayBlockingQueue 只有put方法和ta ...

  2. python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

    今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...

  3. Java多线程与并发库高级应用-可阻塞的队列

    ArrayBlockQueue 可阻塞的队列 > 队列包含固定长度的队列和不固定长度的队列. > ArrayBlockQueue > 看BlockingQueue类的帮助文档,其中有 ...

  4. 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

    我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...

  5. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  6. 8.12 day31 进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程

    进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点: ...

  7. Python中多线程的阻塞问题

    在使用Queue模块+多线程模拟生产者+消费者问题时,遇到了一个小问题,现在记录下来.供可能会遇到类似问题的初学者们参考. 该问题的完整参考代码如下.主要实现了以下的功能:在一个线程中,开启生产者模式 ...

  8. Java并发包源码学习系列:基于CAS非阻塞并发队列ConcurrentLinkedQueue源码解析

    目录 非阻塞并发队列ConcurrentLinkedQueue概述 结构组成 基本不变式 head的不变式与可变式 tail的不变式与可变式 offer操作 源码解析 图解offer操作 JDK1.6 ...

  9. atitit. java queue 队列体系and自定义基于数据库的队列总结o7t

    atitit. java queue 队列体系and自定义基于数据库的队列总结o7t 1. 阻塞队列和非阻塞队列 1 2. java.util.Queue接口, 1 3. ConcurrentLink ...

随机推荐

  1. 纯css实现隐藏滚动条仍可以滚动

    移动端弹出层加了滚动条之后,滚动条一直在,有些不美观,overflow:hidden;虽然可以隐藏滚动条,但是不能滚动.需要实现隐藏滚动条但是仍可以滚动,js实现太麻烦,直接将滚动条隐藏会更好一些. ...

  2. Java获取当前服务器IP

    package hope.ipaddress.demo; import java.net.InetAddress; import java.net.NetworkInterface; import j ...

  3. Canvas-图片填充-预加载

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. Java读取、创建Excel;验签,加密

    需要架包:poi相关jar,Md5.jar------------------------------------------------------------------------------- ...

  5. ZOJ 1648 Circuit Board(计算几何)

    Circuit Board Time Limit: 2 Seconds Memory Limit: 65536 KB On the circuit board, there are lots of c ...

  6. Converts Internet addresses to Internet numbers. ip2long long2ip

    http://php.net/manual/en/function.long2ip.phpPHP: ip2long - Manual http://php.net/manual/en/function ...

  7. 面试题15:链表中倒数第K个结点

    输入一个链表,输出该链表中倒数第k个结点. 方法1: 这个解法要循环两次链表 /* public class ListNode { int val; ListNode next = null; Lis ...

  8. 我的Android进阶之旅------>Java全角半角的转换方法

    一中文全角和半角输入的区别 1全角指一个字符占用两个标准字符位置 2半角指一字符占用一个标准的字符位置 3全角与半角各在什么情况下使用 4全角和半角的区别 5关于全角和半角 6全角与半角比较 二转半角 ...

  9. sql server如何把查询结果发邮件出去

    原本:https://zhidao.baidu.com/question/1819725575342685788.html --1.启用Database Mail扩展存储过程 sp_configure ...

  10. is和==

    ==判断两个对象值是否相等 is表示两个变量是否指向一块对象