java阻塞队列实现 生产者消费者 模型

2019
0 77

        在生产中我们可能会遇到在处理正常业务的过程中,其中会夹杂着一些非必需或不是特别重要的业务,而且这些业务还比较耗时,这个时候为了不影响正常业务性能,我们可以这些不是特别重要而且还比较耗时的业务独立出来,放入后台的一个执行队列中,后台可以慢慢执行,当队列中没有业务数据时,使该执行线程进入等待状态。当业务数据添加进队列中后唤醒处于等待状态的执行线程,继续处理业务。

一、阻塞队列的实现

package com.dzqc.uniauth.config;
/**
 * 	链式阻塞队列
 * @author 硅谷探秘者(jia)
 * @param <E>
 */
public class LinkedBlockingQueue<E> {
	class Node{
		public E e;
		public Node next;
		public Node prev;
		public Node(E e) {
			super();
			this.e = e;
		}
	}
	//队首
	private Node head=null;
	//队尾
	private Node tail=null;
	//队列长度
	private volatile int size=0;
	//入队
	public synchronized void push(E e) {
		Node n=new Node(e);
		if(size==0) {
			head=tail=n;
		}else {
			n.prev=tail;
			tail.next=n;
			tail=n;
		}
		size++;
		//唤醒业务线程执行业务
		this.notify();
	}
	//出队
	public synchronized E pop() {
		Node n=null;
		if(size==1) {
			n=head;
			head=tail=null;
			size--;
		}else if(size>1){
			n=head;
			head=head.next;
			n.next=head.prev=null;
			size--;
		}
		return n==null?null:n.e;
	}
	//当前线程休眠
	public synchronized void waits() {
		try {
			this.wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

二、并发下的业务场景模拟测试

package com.dzqc.uniauth.config;

import java.util.concurrent.atomic.AtomicInteger;

class Art{
	public int a;
	public Art(int a){
		this.a=a;
	}
}
public class Test {
	
  static AtomicInteger p=new AtomicInteger(0);
  static AtomicInteger q=new AtomicInteger(0);
	
	public static void main(String[] args) throws InterruptedException {
		
		LinkedBlockingQueue<Art> l=new LinkedBlockingQueue<Art>();
		/**
		 * 	处理业务的线程
		 */
		new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while(true) {
					Art a=l.pop();
					if(a!=null) {
						System.out.println("处理业务:"+a.a);
						try {
							//模拟耗时
							Thread.sleep(3);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}else {
						//休眠
						l.waits();
					}
				}
			}
		}).start();
		
		/**
		 * 	产生业务的线程
		 */
		Thread ts[]=new Thread[3000];
		for(int i=0;i<3000;i++) {
			ts[i]=new Thread(new Runnable(){
				@Override
				public void run() {
					// TODO Auto-generated method stub
					l.push(new Art(p.addAndGet(1)));
					q.addAndGet(1);
				}
			});
			ts[i].start();
		}
		for(Thread t:ts) {
			t.join();
		}
		Thread.sleep(10000);
		/**
		 * 	产生业务的线程
		 */
		Thread ts2[]=new Thread[3000];
		for(int i=0;i<3000;i++) {
			ts2[i]=new Thread(new Runnable(){
				@Override
				public void run() {
					// TODO Auto-generated method stub
					l.push(new Art(p.addAndGet(1)));
					q.addAndGet(1);
				}
			});
			ts2[i].start();
		}
		for(Thread t:ts2) {
			t.join();
		}
		System.out.println("--"+q);
	}
}

 

留言(0)
加载更多
猜你喜欢
  • blog asm类描述符和方法描述符

    1.内部名 在许多情况下,一种类只能是类或接口类。例如,一个类的超类、由一个类的接口,或由一个方法抛出的异常就不能是基元类或数组类,必须是类或接口类。这些类在已编译类中用内部名字表示。一个类的内部名就是这个类
  • blog java用数组优先级(小顶堆)

    优先级 普通的是一种先进先出的数据结构,元素在尾追加,而从头删除。在优先中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先具有最高级先出 (first in, largest out
  • blog java内存分析-java虚拟机栈最大深度问题与优化

    Java虚拟机栈都包含那些东西         在阅读过深入理解java虚拟机以后了解到java虚拟机栈包括栈帧、局部变量表、操作数栈、动态链接、方法返回等。 Java虚拟机栈都储存那些内容呢
  • blog jvm内存分析(4)对象的创建和内存布局

    这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料 深入理解java虚拟机《周志明》1.对象的内存布局HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、
  • blog jvm内存分析(3)之局部变量表

    原文:https://blog.csdn.net/wuzhiwei549/article/details/80636404笔记:局部变量表已了解--每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、
  • blog jvm内存分析-垃圾收集算法

    1.标记-清除算法         最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如同它的名字一样,算法分为“标记”和“清
  • ofc javascript优先级(小顶堆)

    javascript优先级(小顶堆)
  • blog java内存分析-hotspot虚拟机对象探秘

    Java对象的创建 Java是一门面向对象的编程语言,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(例如克隆、反序化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不
  • blog jvm内存分析-类的主动引用于被动引用

    类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个命周期包括:加载(LoadingVerification)、准备(Preparation)、解析(Resolution)、初始化 (Initializa
  • blog jvm内存分析(5)堆内存溢出以及分析

    jvm内存分析(5)堆内存溢出以及分析1.拟堆内存溢出代码package test;import java.util.ArrayList;import java.util.List;/** * VM Args:-Xms20m -Xmx