加入收藏 | 设为首页 | 会员中心 | 我要投稿 通化站长网 (https://www.0435zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

API网关限流熔断实现关键逻辑思路

发布时间:2021-02-18 13:32:21 所属栏目:动态 来源:互联网
导读:「ArrayBlockingQueue」 ArrayBlockingQueue是用数组实现的「有界阻塞队列」,必须指定队列大小,先进先出(FIFO)原则排队 「LinkedBlockingQueue」 是用链表实现的「有界阻塞队列」,如果构造LinkedBlockingQueue时没有指定大小,则默认是Integer.MAX_VALUE

「ArrayBlockingQueue」

  • ArrayBlockingQueue是用数组实现的「有界阻塞队列」,必须指定队列大小,先进先出(FIFO)原则排队

「LinkedBlockingQueue」

  • 是用链表实现的「有界阻塞队列」,如果构造LinkedBlockingQueue时没有指定大小,则默认是Integer.MAX_VALUE,无限大
  • 该队列生产端和消费端使用独立的锁来控制数据操作,以此来提高队列的并发性

plan A:任务的execute,先判断核心线程数量达到上限;否,则创建核心线程来执行任务;是,则执行plan B

plan B:当任务数大于核心数时,任务被加入阻塞队列,如果超过阻塞队列的容量上限,执行C

plan C: 阻塞队列不能接受任务时,且设置的maximumPoolSize大于corePoolSize,创建新的非核心线程执行任务

plan D:当plan A、B、C都无能为力时,使用拒绝策略处理

7 阻塞队列的简单了解

  • 队列的阻塞插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满
  • 队列的阻塞移除:当队列为空时,获取元素的线程会等待队列变为非空
  • BlockingQueue提供的方法如下,其中put和take是阻塞操作


  • 1 corePoolSize:核心线程数,线程池维持的线程数量
  • 2 maximumPoolSize:最大的线程数,当阻塞队列不可再接受任务时且maximumPoolSize大于corePoolSize则会创建非核心线程来执行。无任务执行时,会被销毁
  • 3 keepAliveTime:非核心线程在闲暇间的存活时间
  • 4 TimeUnit:和keepAliveTime配合使用,表示keepAliveTime参数的时间单位
  • 5 workQueue:正在执行的任务数超过corePoolSize时,任务的等待阻塞队列
  • 6 threadFactory:线程的创建工厂
  • 7 handler:拒绝策略,线程数达到了maximumPoolSize,还有任务提交则使用拒绝策略处理

6 线程池原理之执行流程

 

start与run方法的区别

  • start是Thread类的方法,从线程的生命周期来看,start的执行并不意味着新线程的执行,而是让JVM分配虚拟机栈,进入Runnable状态,start的执行还是在旧线程上
  • run则是新线程被系统调度,获取CPU时,执行的方法,必须是继承Thread或者是实现Runnable接口
    • Thread.sleep与Object.wait区别
  • Thread.sleep需要指定休眠时间,时间一到继续运行;和锁机制无关,不能加锁也不用释放锁
  • Object.wait需要在synchronized中调用,否则报IllegalMonitorStateException错误。wait方法会释放锁,需要调用相同锁对象Object.notify来唤醒线程

4 线程池及其优点

  • 线程的每次使用时创建,结束再销毁,是非常巨大的开销。若用缓存的策略(线程池),暂存曾经创建的线程,复用这些线程,可以减少程序的消耗,提高线程的利用率
  • 降低资源消耗:重复利用线程可降低线程创建和销毁造成的消耗
  • 提高响应速度:当任务到达时,不需要等待线程创建就能立即执行
  • 提高线程的可管理性:使用线程池可以进行统一的分配,监控和调优

5 JDK封装的线程池



(编辑:通化站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!