一: Queue详解

   Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构

   Queue接口与List、Set同一级别,都是继承了Collection接口。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)机制。

  下表显示了jdk1.5中的阻塞队列的操作:

    add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常
    remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
    element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
    offer       添加一个元素并返回true       如果队列已满,则返回false
    poll         移除并返问队列头部的元素    如果队列为空,则返回null
    peek       返回队列头部的元素             如果队列为空,则返回null
    put         添加一个元素                      如果队列满,则阻塞
    take        移除并返回队列头部的元素     如果队列为空,则阻塞

    3)、示例

  1. package com.svse.queue;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. import java.util.Timer;
  5. import java.util.TimerTask;
  6. import com.svse.entity.Users;
  7.  
  8. class TestQueue {
  9.  
  10. static Queue<Users> queueUsers=new LinkedList<Users>();
  11. static{
  12. Users user1=new Users("201","张三","男","27","歌手");
  13. Users user2=new Users("202","李思","女","26","演员");
  14. queueUsers.add(user1);
  15. queueUsers.add(user2);
  16. }
  17.  
  18. public void test1(){
  19.  
  20. Queue<String> queue = new LinkedList<String>();
  21. queue.offer("Hello");
  22. queue.offer("World!");
  23. queue.offer("你好!");
  24.  
  25. System.out.println(queue.size());
  26.  
  27. while (queue.size() > 0) {
  28. String element = queue.poll();
  29. System.out.println(element);
  30. }
  31. System.out.println();
  32. System.out.println(queue.size());
  33. }
  34.  
  35. //生产者
  36. public void producerQueue(){
  37.  
  38. System.out.println(queueUsers.size());
  39. }
  40.  
  41. //消费者
  42. public void consumerQueue(){
  43. Users u=null;
  44. while((u=queueUsers.poll())!=null){
  45. System.out.println(u+" ");
  46. }
  47. System.out.println();
  48. System.out.println(queueUsers.size());
  49. }
  50.  
  51. public static void main(String[] args) {
  52. TestQueue tq=new TestQueue();
  53. //tq.producerQueue();
  54. //tq.consumerQueue();
  55.  
  56. timerTest();
  57.  
  58. }
  59.  
  60. }

: 不怕难之BlockingQueue及其实现

  1)、 前言

BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:

        在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,它们的区别主要体现在存储结构上或对元素操作上的不同,但是对于take与put操作的原理,却是类似的。

  2)、阻塞与非阻塞

  入队

offer(E e):如果队列没满,立即返回true; 如果队列满了,立即返回false-->不阻塞

put(E e):如果队列满了,一直阻塞,直到队列不满了或者线程被中断-->阻塞

offer(E e, long timeout, TimeUnit unit):在队尾插入一个元素,,如果队列已满,则进入等待,直到出现以下三种情况:-->阻塞

被唤醒

等待时间超时

当前线程被中断

  出队

poll():如果没有元素,直接返回null;如果有元素,出队

take():如果队列空了,一直阻塞,直到队列不为空或者线程被中断-->阻塞

poll(long timeout, TimeUnit unit):如果队列不空,出队;如果队列已空且已经超时,返回null;如果队列已空且时间未超时,则进入等待,直到出现以下三种情况:

被唤醒

等待时间超时

当前线程被中断

  3)、示例

  1. package com.yao;
  2. import java.util.concurrent.ArrayBlockingQueue;
  3. import java.util.concurrent.BlockingQueue;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. public class BlockingQueueTest {
  7. /**
  8. 定义装苹果的篮子
  9. */
  10. public static class Basket{
  11. // 篮子,能够容纳3个苹果
  12. BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
  13.  
  14. // 生产苹果,放入篮子
  15. public void produce() throws InterruptedException{
  16. // put方法放入一个苹果,若basket满了,等到basket有位置
  17. basket.put("An apple");
  18. }
  19. // 消费苹果,从篮子中取走
  20. public String consume() throws InterruptedException{
  21. // get方法取出一个苹果,若basket为空,等到basket有苹果为止
  22. String apple = basket.take();
  23. return apple;
  24. }
  25.  
  26. public int getAppleNumber(){
  27. return basket.size();
  28. }
  29.  
  30. }
  31. // 测试方法
  32. public static void testBasket() {
  33. // 建立一个装苹果的篮子
  34. final Basket basket = new Basket();
  35. // 定义苹果生产者
  36. class Producer implements Runnable {
  37. public void run() {
  38. try {
  39. while (true) {
  40. // 生产苹果
  41. System.out.println("生产者准备生产苹果:"
  42. + System.currentTimeMillis());
  43. basket.produce();
  44. System.out.println("生产者生产苹果完毕:"
  45. + System.currentTimeMillis());
  46. System.out.println("生产完后有苹果:"+basket.getAppleNumber()+"个");
  47. // 休眠300ms
  48. Thread.sleep(300);
  49. }
  50. } catch (InterruptedException ex) {
  51. }
  52. }
  53. }
  54. // 定义苹果消费者
  55. class Consumer implements Runnable {
  56. public void run() {
  57. try {
  58. while (true) {
  59. // 消费苹果
  60. System.out.println("消费者准备消费苹果:"
  61. + System.currentTimeMillis());
  62. basket.consume();
  63. System.out.println("消费者消费苹果完毕:"
  64. + System.currentTimeMillis());
  65. System.out.println("消费完后有苹果:"+basket.getAppleNumber()+"个");
  66. // 休眠1000ms
  67. Thread.sleep(1000);
  68. }
  69. } catch (InterruptedException ex) {
  70. }
  71. }
  72. }
  73.  
  74. ExecutorService service = Executors.newCachedThreadPool();
  75. Producer producer = new Producer();
  76. Consumer consumer = new Consumer();
  77. service.submit(producer);
  78. service.submit(consumer);
  79. // 程序运行10s后,所有任务停止
  80. try {
  81. Thread.sleep(10000);
  82. } catch (InterruptedException e) {
  83. }
  84. service.shutdownNow();
  85. }
    86
  86. public static void main(String[] args) {
  87. BlockingQueueTest.testBasket();
  88. }
  89. }

: 定时器之Timer

  1. package com.svse.queue;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4.  
  5. public class TestTimer {
  6.  
  7. static int i=0;
  8. public static void timerTest(){
  9. //创建一个定时器
  10. Timer timer = new Timer();
  11. //schedule方法是执行时间定时任务的方法
  12. timer.schedule(new TimerTask() {
  13. @Override
  14. public void run() {
  15. i++;
  16. System.out.println("timerTest: "+i);
  17. }
  18. }, 1000, 60000); //第一个参数时间 从多少毫秒之后开始执行 第二个时间参数 间隔多少毫秒之后再执行 1分钟一次
  19. }
  20.  
  21. public static void main(String[] args) {
  22.  
  23. timerTest();
  24.  
  25. }
  26.  
  27. }

Java队列和定时器Timer的更多相关文章

  1. Java内置定时器Timer

    Timer是Java内置的一个定时任务,类似于JavaScript里面的setTimeout()和setInterval()方法,可以延迟一定的时间执行任务,也可以按时间间隔重复执行任务. Timer ...

  2. Java中的定时器Timer

    java.util.Timer是一个实用工具类,该类用来调度一个线程,使线程可以在将来某一时刻开始执行. Java的Timer类可以调度一个线程运行一次,或定期运行. java.util.TimerT ...

  3. Java基础_死锁、线程组、定时器Timer

    一.死锁问题: 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 比如,线程一需要第一把所,此时锁处于空闲状态,给了 ...

  4. Java进阶(十八)Java实现定时器(Timer)

    Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...

  5. Java多线程编程(五)定时器Timer

    一.定时器Timer的使用 在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类确实TimerTask类,执行计 ...

  6. Java中定时器Timer致命缺点(附学习方法)

    简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...

  7. java 多线程Thread 子类 定时器Timer

    定时器Timer, 定时器分类: 1,指定时间指定任务(明天早上8点准时提醒我起床),相当于linux里面的at命令 2,周期性的执行任务(每隔三分钟闹钟响一次),相当于Linux里面的cron命令 ...

  8. JAVA多线程提高一:传统线程技术&传统定时器Timer

    前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统 ...

  9. 《JAVA多线程编程核心技术》 笔记:第五章:定时器Timer

    一.定时器Timer的使用 1.1 方法schedule(TimerTask task, Date time) 是否过期 执行说明 开始执行时间 time>当前时间(未过期) 在time到达时执 ...

随机推荐

  1. Hazelcast介绍

    Hazelcast介绍 什么时侯需要用例 内存中分布式计算 场景分布式消息 特性 全景 Distributed Maps 一个结点中分区 Hazelcast中的分片也称为分区,Hazelcast默认2 ...

  2. Python+Unittest+Requests+PyMysql+HTMLReport 接口自动化框架

    整体框架使用的是:Python+Unittest+Requests+PyMysql+HTMLReport  多线程并发模式 主要依赖模块 Unittest.Requests.PyMysql.HTMLR ...

  3. io流追加到一个文件中信息比如日志

    package com.yh.day02.arrays; import java.io.File;import java.io.FileInputStream;import java.io.FileN ...

  4. 【bzoj4671】异或图(容斥+斯特林反演+线性基)

    传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...

  5. JavaScript-打印倒三角形和正三角形

    倒三角形 <script> var str=''; for(var i=1;i<=10;i++){ for(var j=i; j<=10;j++){ var str=str + ...

  6. 给OPi Zero Plus添加USB启动功能

    为使OPi Zero Plus支持U盘启动,需要在板载的SPI Flash当中刷入uboot.在这个过程当中绕了很多弯路,特此记录 最终操作步骤见文末 网上的教程仅使用sudo modprobe sp ...

  7. verilog常见错误列表

    Error/Warning 来源:https://hdlbits.01xz.net/wiki/ 题目: 1.Quartus Warning 10235: Warning (): Verilog HDL ...

  8. springboot hikari 连接池 在启动时未初始化数据库连接问题

    在启动Springboot 项目时 2019-11-18 21:32:38.223 INFO 1080 --- [on(4)-127.0.0.1] o.s.web.servlet.Dispatcher ...

  9. IO流与装饰者模式

    java使用IO流来处理不同设备之间数据的交互;所有的IO操作实际上都是对 Stream 的操作 从功能上划分: 输入流: 当数据从源进入的编写的程序时,称它为输入流; 输出流: 从程序输出回另一个源 ...

  10. jQuery从零开始(一)

    1.jQuery是什么? 轻量级的工具库,类库. Jquery可以写的很少的代码,干的很多的事情. 2.学习心态,常用的功能 jQuery只是一个工具,它的实现原理还是js.以练习为主,多看多练. 常 ...