java queue队列demo

java

1.ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。

2.ArrayBlockingQueue内部通过Object[]数组保存数据的,也就是说ArrayBlockingQueue本质上是通过数组实现的。ArrayBlockingQueue的大小,即数组的容量是在创建创建ArrayBlockingQueue时候指定的。

3.如下图所示,ArrayBlockingQueue和ReentrantLock是组合关系,ArrayBlockingQueue中包含一个ReentrantLock对象。ReentrantLock是可重入的互斥锁。ArrayBlockingQueue就是根据ReentrantLock互斥锁实现"多线程对共享资源的访问"。

  ReentrantLock分为公平锁和非公平锁,关于具体使用公平锁还是非公平锁,在创建ArrayBlockingQueue时可以指定; 而且ArrayBlockingQueue默认会使用非公平锁。

4.ArrayBlockingQueue和Condition是组合关系,ArrayBlockingQueue中包含两个Condition对象(notEmpty和notFull)。使用通知模式实现:所谓通知模式,当生产者往满的队列里面添加元素的时候,会阻塞生产者(调用Condition notFull.await()进行等待);

  当消费者消费了一个队列中的元素后,会通知(调用Condition notFull.signal()唤醒生产者)生产者当前队列可用。反之,当消费者消费的时候,发现队列是空的,则消费者会被阻塞(通过Condition的 notEmpty.await()进行等待),

  当生产者插入了队列中的一个元素后,则会调用notEmpty.signal()唤醒消费者继续消费。

package com.demo.zlearn.queue;

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.BlockingQueue;

public class ArrayBlockingQueueDemo {

public static void main(String[] args) throws Exception {

BlockingQueue queue = new ArrayBlockingQueue(5,true);

Producer producer = new Producer(queue);

Consumer consumer1 = new Consumer(queue,1000);

new Thread(producer).start();

new Thread(consumer1).start();

}

}

class Producer implements Runnable{

protected BlockingQueue queue = null;

public Producer(BlockingQueue queue) {

this.queue = queue;

}

public void run() {

try {

for(int i=0;i<10;i++){

System.out.println("put:"+i);

queue.put("AA");

Thread.sleep(4000);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

class Consumer implements Runnable{

protected BlockingQueue queue = null;

private long sleepTimes = 0;

public Consumer(BlockingQueue queue,long sleepTimes) {

this.queue = queue;

this.sleepTimes = sleepTimes;

}

public void run() {

try {

while(true){

System.out.println("isEmpty:"+queue.isEmpty()+"\n"+

"size:"+queue.size()+"\n"+

"remainingCapacity:"+queue.remainingCapacity()+"\n" +

"take:"+queue.take()+"\n"+

"sleepTimes:"+sleepTimes); //take 如果队列为空,则阻塞

System.out.println("-----------------------");

Thread.sleep(sleepTimes);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

----------------------------------------------------------------------------------------------------------------------

put:0
isEmpty:true
size:0
remainingCapacity:5
take:AA
sleepTimes:1000
-----------------------
put:1
isEmpty:true
size:0
remainingCapacity:5
take:AA
sleepTimes:1000
-----------------------
put:2
isEmpty:true
size:0
remainingCapacity:5
take:AA
sleepTimes:1000
-----------------------
put:3
isEmpty:true
size:0
remainingCapacity:5
take:AA
sleepTimes:1000
-----------------------

 

以上是 java queue队列demo 的全部内容, 来源链接: utcz.com/z/390381.html

回到顶部