Java队列栈

参考低调人生的博客,网址:https://www.cnblogs.com/lemon-flm/p/7877898.html

一、栈为后进先出。

 

Stack<Integer> stack=new Stack<Integer>(); //java 栈  后进先出

例子:

package test;

import java.util.Stack;

public class JavaStack {
    
    /*
     Java Stack 类
            栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
            堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
     * */
    public static void stackTest(){
       
        Stack<Integer> stack=new Stack<Integer>(); //java 栈  后进先出
        Stack<Integer> stack2=new Stack<Integer>(); //java 栈  后进先出
        
        for(int i=0;i<5;i++){
            int y=stack.push(i);//把项压入堆栈顶部
            boolean y2=stack2.add(i);
            //System.out.println("y="+y+"  y2="+y2);
            System.out.println("添加值为"+y+",目前栈集合为:"+stack+"  --栈顶为"+stack.peek());
        }
        
        int t=stack.peek();//查看堆栈顶部对象
        //int t2=stack2.peek();//查看堆栈顶部对象
        System.out.println("获取栈顶元素为="+t);  
    } 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        stackTest();//栈测试
       
    }

}

2、队列是先进先出

Queue:是FIFO(先入先出)的数据结构。其中,LinkedList实现了Deque接口。

1、没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口
  内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue
  PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。 
  PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
  ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,          ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。


2)实现阻塞接口的:
  java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
五个队列所提供的各有不同:
  * ArrayBlockingQueue :一个由数组支持的有界队列。
  * LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
  * PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
  * DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
  * SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

 

 

package queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BlockingQueueTest {
 /**
 定义装苹果的篮子
  */
 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();
  Producer producer = new Producer();
  Consumer consumer = new Consumer();
  service.submit(producer);
  service.submit(consumer);
  // 程序运行10s后,所有任务停止
  try {
   Thread.sleep(10000);
  } catch (InterruptedException e) {
  }
  service.shutdownNow();
 }
 public static void main(String[] args) {
  BlockingQueueTest.testBasket();
 }
}

 

 

生产者准备生产苹果:1552837572335
消费者准备消费苹果:1552837572335
生产者生产苹果完毕:1552837572336
消费者消费苹果完毕:1552837572336
生产完后有苹果:0个
消费完后有苹果:0个
生产者准备生产苹果:1552837572636
生产者生产苹果完毕:1552837572636
生产完后有苹果:1个
生产者准备生产苹果:1552837572936
生产者生产苹果完毕:1552837572936
生产完后有苹果:2个
生产者准备生产苹果:1552837573236
生产者生产苹果完毕:1552837573236
生产完后有苹果:3个
消费者准备消费苹果:1552837573336
消费者消费苹果完毕:1552837573336
消费完后有苹果:2个
生产者准备生产苹果:1552837573536
生产者生产苹果完毕:1552837573536
生产完后有苹果:3个
生产者准备生产苹果:1552837573836
消费者准备消费苹果:1552837574336
生产者生产苹果完毕:1552837574336
生产完后有苹果:3个
消费者消费苹果完毕:1552837574337
消费完后有苹果:3个
生产者准备生产苹果:1552837574638
消费者准备消费苹果:1552837575338
生产者生产苹果完毕:1552837575338
生产完后有苹果:3个
消费者消费苹果完毕:1552837575338
消费完后有苹果:3个
生产者准备生产苹果:1552837575638
消费者准备消费苹果:1552837576338
生产者生产苹果完毕:1552837576338
生产完后有苹果:3个
消费者消费苹果完毕:1552837576338
消费完后有苹果:3个
生产者准备生产苹果:1552837576638
消费者准备消费苹果:1552837577338
生产者生产苹果完毕:1552837577338
生产完后有苹果:3个
消费者消费苹果完毕:1552837577338
消费完后有苹果:3个
生产者准备生产苹果:1552837577638
消费者准备消费苹果:1552837578338
生产者生产苹果完毕:1552837578338
生产完后有苹果:3个
消费者消费苹果完毕:1552837578338
消费完后有苹果:3个
生产者准备生产苹果:1552837578638
消费者准备消费苹果:1552837579339
消费者消费苹果完毕:1552837579339
生产者生产苹果完毕:1552837579339
消费完后有苹果:3个
生产完后有苹果:3个
生产者准备生产苹果:1552837579639
消费者准备消费苹果:1552837580339
消费者消费苹果完毕:1552837580339
消费完后有苹果:2个
生产者生产苹果完毕:1552837580340
生产完后有苹果:3个
生产者准备生产苹果:1552837580640
消费者准备消费苹果:1552837581340
消费者消费苹果完毕:1552837581340
消费完后有苹果:2个
生产者生产苹果完毕:1552837581340
生产完后有苹果:3个
生产者准备生产苹果:1552837581641
消费者准备消费苹果:1552837582340
生产者生产苹果完毕:1552837582340
生产完后有苹果:3个
消费者消费苹果完毕:1552837582340
消费完后有苹果:3个
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值