常用线程池

可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程

ExecutorService threadPool = Executors.newFixedThreadPool(3);// 创建可以容纳3个线程的线程池

根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们

ExecutorService threadPool = Executors.newCachedThreadPool();// 线程池的大小会根据执行的任务数动态分配

使用单个 worker 线程的 Executor,以无界队列方式来运行该线程

ExecutorService threadPool = Executors.newSingleThreadExecutor();// 创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务

可安排在给定延迟后运行命令或者定期地执行的线程池

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);// 效果类似于Timer定时器

JVM内部同步机制和JVM外部同步机制

内部同步机制

  • static的强制同步机制
  • synchronized的同步机制:可以使用this、类字面常亮、特有锁对象(专门为加锁使用,无实际意义的对象,此种方式效率更高。)

外部同步机制

ReentrantLock(可重入的锁)

  • synchronized关键字同步的时候,等待的线程将无法控制,只能死等。

解决方式:ReentrantLock可以使用tryLock(timeout, unit)方法去控制等待获得锁的时间,也可以使用无参数的tryLock方法立即返回,这就避免了死锁出现的可能性。

  • synchronized关键字同步的时候,不保证公平性,因此会有线程插队的现象。

解决方式:ReentrantLock可以使用构造方法ReentrantLock(fair)来强制使用公平模式,这样就可以保证线程获得锁的顺序是按照等待的顺序进行的,而synchronized进行同步的时候,是默认非公平模式的,但JVM可以很好的保证线程不被饿死。

ReentrantLock有这样一些优点,当然也有不足的地方。最主要不足的一点,就是ReentrantLock需要开发人员手动释放锁,并且必须在finally块中释放。

JVM内部条件控制机制和JVM外部条件控制机制

JVM内部条件控制机制

在Object中,有一个wait的本地方法;它可以用来协调线程之间的协作。

wait一般情况下最常用的场景是构造一个花销非常大的对象的时候,比如JDK动态代理在生成代理类的时候就使用了这种方式。JDK6在生成一个代理类之前,会先检测一个是否正在生成中的标识,如果正在生成的话,JDK6就会在对象上等待,直到正在生成的代理类生成完毕,然后直接从缓存中获取。

wait,notify和notifyAll方法在使用前,必须获取到当前对象的锁,否则会告诉你非法的监控状态异常。还有一点,则是如果有多个线程在wait等待,那么调用notify会随机通知其中一个线程,而不会按照顺序通知。换句话说,notify的通知机制是非公平的,notify并不保证先调用wait方法的线程优先被唤醒。notifyAll方法则不存在这个问题,它将通知所有处于wait等待的线程。

JVM外部条件控制机制

JDK的类库中,有这样的一个类Condition,来弥补wait方法本身的不足。

  • wait方法当使用带参数的方法wait(timeout)或者wait(timeout,nanos)时,无法反馈究竟是被唤醒还是到达了等待时间,大部分时候,我们会使用循环(就像上面的例子一样)来检测是否达到了条件。

解决方式:Condition可以使用返回值标识是否达到了超时时间。

  • 由于wait,notify,notifyAll方法都需要获得当前对象的锁,因此当出现多个条件等待时,则需要依次获得多个对象的锁,这是非常恶心麻烦且繁琐的事情。

解决方式:Condition之需要获得Lock的锁即可,一个Lock可以拥有多个条件。

JVM外部 线程协作

CountDownLatch

这个类是为了帮助猿友们方便的实现一个这样的场景,就是某一个线程需要等待其它若干个线程完成某件事以后才能继续进行。

CyclicBarrier

这个类是为了帮助猿友们方便的实现多个线程一起启动的场景,就像赛跑一样,只要大家都准备好了,那就开始一起冲。比如下面这个程序,所有的线程都准备好了,才会一起开始执行。

Semaphore

这个类是为了帮助猿友们方便的实现控制数量的场景,可以是线程数量或者任务数量等等。

Exchanger

这个类是为了帮助猿友们方便的实现两个线程交换数据的场景,使用起来非常简单。

参考文档:

  • http://blog.csdn.net/ghsau/article/details/7443324
  • http://www.cnblogs.com/zuoxiaolong/p/con2.html

线程池及并发编程基础总结相关推荐

  1. 通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,submit 等方法提交线程池任务的区别,来深入理解线程池及并发编程

    前言 以前使用线程池,对execute . submit 等方法提交线程池任务的区别比较模糊,现在通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,s ...

  2. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  3. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

  4. Day841.Executor与线程池-Java 并发编程实战

    Executor与线程池 Hi,我是阿昌,今天学习记录的是关于Executor与线程池. 虽然在 Java 语言中创建线程看上去就像创建一个对象一样简单,只需要 new Thread() 就可以了,但 ...

  5. java并发测试 线程池,Java并发编程——线程池

    1.任务与执行策略间的隐性耦合 一些任务具有这样的特征:需要或者排斥某种特定的执行策略.对其他任务具有依赖性的任务,就会要求线程池足够大,来保证它锁依赖任务不必排队或者不被拒绝:采用线程限制的任务需要 ...

  6. 项目使用线程池_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  7. 线程池——JAVA并发编程指南

    TPS00-J. 用线程池实现应用在流量暴涨时优雅降级 很多程序都要解决这样一个问题--处理一系列外来的请求.Thread- Per-Message这种设计模式是最简单的并发策略了,它为每一个请求创建 ...

  8. java 批量插入clob_SpringBoot系列(16)线程池Executors并发编程之批量查询-插入数据

    在上篇文章中Debug给大家分享介绍了"Java线程池-多线程的其中一种应用场景~广播式给所有有效用户发送邮件(通知)",本篇文章我们将继续向前迈进,继续介绍并实战"线程 ...

  9. Java并发编程的艺术-Java并发编程基础

    第4章 Java并发编程基础 ​ Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将 ...

最新文章

  1. LNMP架构php-fpm相关配置
  2. python心得1000字-经典教材《统计学习导论》现在有了Python版
  3. Opengl-帧缓冲(一个新的缓冲对象,想一下深度和模板缓冲)
  4. js检测字符串方法大全
  5. python 声明变量_Python的变量声明
  6. 中国深圳,600架无人机的盛典!
  7. 40 个 SpringBoot 常用注解:让生产力爆表!
  8. java反射基础_Java反射基础(一)--Class对象获取
  9. 手摸手深入理解JVM虚拟机--在MacOS系统上编译OpenJDK12并使用CLion调试靠谱教程
  10. 反向传播算法的直观理解
  11. 2020计算机视觉会议地点,2020年计算机视觉与信息技术国际会议(CVIT 2020)
  12. UVA1449 Dominating Patterns
  13. android 自动下一首,Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
  14. knockout js之select
  15. CyberGhost使用、下载、注册【完整教程】
  16. 调息之法-整理的两篇有关养生的小文章
  17. 发表一下开学以来的一些感想
  18. 提示信息弹出(toast)
  19. python分析推特_最全多维度分析TWITTER(推特)
  20. java支付宝无密退款

热门文章

  1. 树(5)-----判断两颗树一样或者一棵树是否是另外一颗的子树
  2. solr6.6+jetty+centos+mysql
  3. JavaScript之模仿块级作用域
  4. Linux下修改时区
  5. [转]Sublime Text 2 C++编译运行简单配置
  6. 算法Top(K)问题
  7. disruptor消费者模型
  8. 华为手机连接电脑用什么软件_屏幕镜像怎么连接电脑?使用这款软件,轻松投屏苹果手机到电脑...
  9. Java面试题:高并发环境下,jdk7 HashMap可能出现的致命问题。注意:是在jdk7与及以下版本
  10. gorm利用钩子函数BeforeUpdate更新某个字段