1). java并发包介绍
  JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,
  主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。

2).线程池的创建
  线程池的5中创建方式:
    a、 Single Thread Executor : 只有一个线程的线程池,因此所有提交的任务是顺序执行,
      代码: Executors.newSingleThreadExecutor()
    b、 Cached Thread Pool : 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,
      如果线程超过60秒内没执行,那么将被终止并从池中删除,
      代码:Executors.newCachedThreadPool()
    c、 Fixed Thread Pool : 拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待,
      代码: Executors.newFixedThreadPool(4)
      在构造函数中的参数4是线程池的大小,你可以随意设置,也可以和cpu的核数量保持一致,获取cpu的核数量int
      cpuNums = Runtime.getRuntime().availableProcessors();
    d、 Scheduled Thread Pool : 用来调度即将执行的任务的线程池,
      代码:Executors.newScheduledThreadPool()
    e、 Single Thread Scheduled Pool : 只有一个线程,用来调度任务在指定时间执行,
      代码:Executors.newSingleThreadScheduledExecutor()

3).线程池的使用
  提交 Runnable ,任务完成后 Future 对象返回 null
  提交 Callable,该方法返回一个 Future 实例表示任务的状态

4).java并发包消息队列及在开源软件中的应用
  BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。
  主要的方法是:put、take一对阻塞存取;add、poll一对非阻塞存取。
  插入:
    1) add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则抛出
    2) offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,
      则返回true,否则返回false.
    3) put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程
      被阻断直到BlockingQueue里面有空间再继续读取:
    4) poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
    5) take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止其他
      int remainingCapacity();返回队列剩余的容量,在队列插入和获取的时候,不要瞎搞,数据可能不准
      boolean remove(Object o); 从队列移除元素, 如果存在,即移除一个或者更多,队列改变了返回true
      public boolean contains(Object o); 查看队列是否存在这个元素,存在返回true
      int drainTo(Collection<? super E> c); //移除此队列中所有可用的元素,并将它们添加到给定collection 中。
      int drainTo(Collection<? super E> c, int maxElements); 和上面方法的区别在于,指定了移动的数量

    BlockingQueue有四个具体的实现类,常用的两种实现类为:
      a、ArrayBlockingQueue:一个由数组支持的有界阻塞队列,规定大小的BlockingQueue,
        其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的。
      b、LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue
        有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是
        以FIFO(先入先出)顺序排序的。
        LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用
        到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,
        直到有队列成员被放进来。
      c、LinkedBlockingQueue和ArrayBlockingQueue区别:
        LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,
        导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的
        可预见性低于ArrayBlockingQueue.

    4).不应用线程池的缺点
      有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(...).start(),对于一般场景是没问题的,
      但如果是在并发请求很高的情况下,就会有些隐患:
      a).新建线程的开销。线程虽然比进程要轻量许多,但对于JVM来说,新建一个线程的代价还是挺大的,决不同于新建一个对象
      b).资源消耗量。没有一个池来限制线程的数量,会导致线程的数量直接取决于应用的并发量,这样有潜在的线程数据
        巨大的可能,那么资源消耗量将是巨大的
      c).稳定性。当线程数量超过系统资源所能承受的程度,稳定性就会成问题

    5).制定执行策略
      在每个需要多线程处理的地方,不管并发量有多大,需要考虑线程的执行策略
      a.任务以什么顺序执行
      b.可以有多少个任务并发执行
      c.可以有多少个任务进入等待执行队列
      d.系统过载的时候,应该放弃哪些任务?如何通知到应用程序?
      e.一个任务的执行前后应该做什么处理

    6).线程池的类型
      不管是通过Executors创建线程池,还是通过Spring来管理,都得清楚知道有哪几种线程池:
      a.FixedThreadPool:定长线程池,提交任务时创建线程,直到池的最大容量,如果有线程非预期结束,会补充新线程
      b.CachedThreadPool:可变线程池,它犹如一个弹簧,如果没有任务需求时,它回收空闲线程,如果需求增加,则按需增加线程,不对池的大小做限制
      c.SingleThreadExecutor:单线程。处理不过来的任务会进入FIFO队列等待执行
      d.SecheduledThreadPool:周期性线程池。支持执行周期性线程任务
      其实,这些不同类型的线程池都是通过构建一个ThreadPoolExecutor来完成的,所不同的是corePoolSize,
      maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory这么几个参数。

Java高级特性—并发包的更多相关文章

  1. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  2. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  3. Java高级特性-String、StringBuffer和StringBuilder

    Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...

  4. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  5. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  6. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  7. Java高级特性之泛型

    首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型?我们先来看看第一个问题什么是泛型.如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了.多态性表示一个对象具备多种状态.比 ...

  8. Java高级特性——注解,这也许是最简单易懂的文章了

    最近,浪尖在做flink的项目时source和sink的绑定那块用到了注解,当然新版本1.6以后就变为server load的方式加载. 但是浪尖也是觉得很有毕业讲一下注解,毕竟高级免试也会问答的吧. ...

  9. Java 高级特性: Lambda 表达式

    本文源代码上传到了码云,请点击 LambdaExpression 获取.Lambda 表达式是 java 8 的新特性,本文讲解了 lambda 表达式的所有知识.内容涉及到 lambda 表达式是什 ...

随机推荐

  1. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询 每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素 n <= 2 ...

  2. codeforces838D - Airplane Arrangements

    太妙啦! 我们把座位摆成一个环,在添加另一个座位,表示坐了这个位置就会有人生气,那么我们现在要求的就是没人坐它的方案数Ans,但是这个并不好求,我们发现对于每个位置,它们的Ans都是一样的,而且Ans ...

  3. vs2015部署---下一代VC运行时库系统:the Universal CRT

    前言 其实the Universal CRT(通用C运行时库)已经不能算是“下一代”,因为它已经在前两年伴随着Visual Studio 2015和Windows10发布.但是由于之前使用VS2015 ...

  4. AlarmManager定时闹钟

    一.AlarmManager介绍: AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent.简单的说就是我们设定一个时间,然后在该时间到来 ...

  5. NetStream配置

    http://support.huawei.com/enterprise/docinforeader!loadDocument1.action?contentId=DOC1000067951& ...

  6. MySQL-python install

    Redhat 7.6 yum install python-devel mysql-devel gcc -y pip install MySQL-python==1.2.5

  7. navicat连接MySQL8.0.11提示2059错误

    错误原因:mysql加密规则的改变: mysql加密规则:mysql_native_password      mysql8之前的版本   caching_sha2_password     mysq ...

  8. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- 猴子排序的期望

    链接:https://www.nowcoder.com/acm/contest/116/F来源:牛客网 题目描述 我们知道有一种神奇的排序方法叫做猴子排序,就是把待排序的数字写在卡片上,然后让猴子把卡 ...

  9. php的一些语法

    命名空间: 一个类为App/Http/Controllers/Controller,则该类的命名空间为App/Http/Controllers,可以通过use关键字导入该类,也可以导入命名空间,但是该 ...

  10. 最近公共祖先 Least Common Ancestors(LCA)算法 --- 与RMQ问题的转换

    [简介] LCA(T,u,v):在有根树T中,询问一个距离根最远的结点x,使得x同时为结点u.v的祖先. RMQ(A,i,j):对于线性序列A中,询问区间[i,j]上的最值.见我的博客---RMQ - ...