java数据结构

  1. 没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口
    内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue
  • PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。
  • PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
  • ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,       ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列
  1. 实现阻塞接口的:
      java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
    五个队列所提供的各有不同:
      * ArrayBlockingQueue :一个由数组支持的有界队列。
      * LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
      * PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
      * DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
      * SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
  element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
  offer       添加一个元素并返回true       如果队列已满,则返回false
  poll         移除并返问队列头部的元素    如果队列为空,则返回null
  peek       返回队列头部的元素             如果队列为空,则返回null
  put         添加一个元素                      如果队列满,则阻塞
  take        移除并返回队列头部的元素     如果队列为空,则阻塞
/**
 * 进行测试和熟悉Queue 队列
 */
public class queueDemo {
    /**
     定义装苹果的篮子
     */
    public static class Basket{
        // 篮子,能够容纳3个苹果
        BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);

        // 生产苹果,放入篮子
        public void produce() throws InterruptedException{
            // put方法放入一个苹果,若basket满了,等到basket有位置
            basket.put("An apple");
        }
        // 消费苹果,从篮子中取走
        public String consume() throws InterruptedException{
            // get方法取出一个苹果,若basket为空,等到basket有苹果为止
            String apple = basket.take();
            return apple;
        }

        public int getAppleNumber(){
            return basket.size();
        }

    }
    // 测试方法
    public static void testBasket() {
        // 建立一个装苹果的篮子
        final Basket basket = new Basket();
        // 定义苹果生产者
        class Producer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        // 生产苹果
                        System.out.println("生产者准备生产苹果:"
                                + System.currentTimeMillis());
                        basket.produce();
                        System.out.println("生产者生产苹果完毕:"
                                + System.currentTimeMillis());
                        System.out.println("生产完后有苹果:"+basket.getAppleNumber()+"个");
                        // 休眠300ms
                        Thread.sleep(300);
                    }
                } catch (InterruptedException ex) {
                }
            }
        }
        // 定义苹果消费者
        class Consumer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        // 消费苹果
                        System.out.println("消费者准备消费苹果:"
                                + System.currentTimeMillis());
                        basket.consume();
                        System.out.println("消费者消费苹果完毕:"
                                + System.currentTimeMillis());
                        System.out.println("消费完后有苹果:"+basket.getAppleNumber()+"个");
                        // 休眠1000ms
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        //产生线程池  == 可缓存线程池
        ExecutorService service = Executors.newCachedThreadPool();
        //创建单线程池
        //ExecutorService service1=Executors.newSingleThreadExecutor();
        //固定线程池 个数
        //Executors.newFixedThreadPool(3);
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        //service.execute(producer);
        //service.execute(producer);
        service.submit(producer);
        service.submit(consumer);
        // 程序运行10s后,所有任务停止
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
        }
        service.shutdownNow();
    }
    public static void main(String[] args) {
        queueDemo.testBasket();
    }
}