参考,欢迎点击原文:https://www.jianshu.com/p/246021d04310(java多线程那点事)
https://blog.csdn.net/fanrenxiang/article/details/79855992(线程池整理,很大篇幅)

科普:
1、Juc (java util concurrent) : java并发包
2、并发编程本质:充分利用cpu资源

池的特点: 线程复用,可以控制最大并发数,管理线程
降低资源消耗,提高响应速度,方便管理

这两天整理和java多线程,随即也看了java的线程池,线程池大致流程如下图


Executors的四种线程池类型:

  • newFixedThreadPool:核心线程数=最大线程数,无界队列,可能大量请求导致oom

  • newSingleThreadExector:核心线程数=最大线程数,单线程,无界队列,可能大量请求导致oom(FIFO)

  • newCachedThreadPool:遇强则强,同步移交队列,没有常驻线程,自动回收,可能大量线程导致oom(适用处理生存期较短的异步任务)

  • newScheduledThreadPool:周期性检查,延迟执行,可能大量线程导致oom

四种线程池特点:

  • newFixedThreadPool:固定线程池,超过要排队

  • newSingleThreadExector:单线程线程池,串型执行

  • newCachedThreadPool:可缓存线程池,灵活回收,灵活新建

  • newScheduledThreadPool:定长线程池,周期性执行

线程池里手动创建,ThreadPoolExecutor参数:

  1. corePoolSize:核心线程数,属常驻线程
  2. maximumPoolSize:最大线程数
  3. keepAliveTime:非核心线程空闲被回收时间
  4. unit:时间单位
  5. workQueue:保存任务的队列,1无界,2有界,3同步移交
  6. threadFactory:创建线程的工厂类,也比如guava
  7. handler:饱和策略

非核心线程: 通过poll拿队列中的任务,会被回收
核心线程: 通过task拿队列中的任务,唤醒其他阻塞线程

可使用的两个类:
Runnable:没有返回值,不能通过throw抛异常,效率更低
Callable:有返回值,能抛异常,new FutureTask(thread)适配类

tip:

  • Future.get可以阻塞获得任务返回结果
  • new Thread创建的是守护进程 ,ThreadFactory创建的是非守护进程
  • ThreadLocal:存线程自身的变量副本
  • StringBuffer为啥是线程安全的:因为多个操作都是在一个对象上进行操作的,且这个类里面很多方法都是用synchronized修饰

设置多少个线程:
cpu密集型:和cpu核心数一样的数量
io密集型:长时间io,cpu两倍

中断:
Shutdown:中断所有没有正在执行的线程
ShutdownNow:中断所有线程

唤醒其他等待线程执行
CyclicBarrier :只能唤起一个任务,可重用;
CountDownLatch(倒计时计算器): 协调多个线程之间的同步,或者说起到线程之间的通信,可以唤起多个任务。不可重用
【原理:countDownLatch是个计数器,减到了0,wait就会被唤醒,执行了,如下图】

线程通信方式:
1消息传递,
2共享内存

【 wait/notify/notifyAll、await/signal/signalAll ,阻塞队列 BlockingQueue 】
Wait需要配合synchronized使用

ABA问题: A->B->A,但是cas没有发现变化,可以使用版本号来避免

使用volatile关键字: 多个线程监听一个变量,读取到volatile修饰的变量都是最新的,禁止指令重排序

实践应用: 看lms的LessonJsonTaskHelper类

java线程池知识整理的更多相关文章

  1. java线程基础知识整理

    目录 线程基本概念 1.java实现线程 2.线程的生命周期 3.线程常用的方法 3.1.sleep() 3.2.interrupt方法 3.3.stop方法 4.线程调度 4.1.常见的线程调度模型 ...

  2. 深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  3. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  4. Java 线程池原理分析

    1.简介 线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销.在应用上,线程池可应用在后端相关服务中.比如 Web 服务器,数据库服务器等 ...

  5. 干货 | 教你如何监控 Java 线程池运行状态

    之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中, ...

  6. 深入浅出JAVA线程池使用原理1

    前言: Java中的线程池是并发框架中运用最多的,几乎所有需要异步或并发执行任务的程序都可以使用线程池,线程池主要有三个好处: 1.降低资源消耗:可以重复使用已经创建的线程降低线程创建和销毁带来的消耗 ...

  7. java线程池和中断总结

    目录 java线程池和中断总结 一. 线程池的使用 二. java中断机制 中断的处理 三. 线程间通信机制总结 java线程池和中断总结 本系列文是对自己学习多线程和平时使用过程中的知识梳理,不适合 ...

  8. Java线程池详解,看这篇就够了!

    构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段. 基础知识 Execu ...

  9. java线程池的初探

    问题来源 发现学习很多技术都提到了线程池的技术,自己的线程池方面没有仔细研究过,现在看了点东西来这里总结下,最近发现写博客是一个很好的锻炼自己并且将学到的东西更加理解的一个方式. 问题探究 java的 ...

  10. Java 线程池的原理与实现 (转)

        最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知 ...

随机推荐

  1. 使用Docker单机部署Ceph

    安装Docker过程参考:https://www.cnblogs.com/hackyo/p/9280042.html 1. 创建Ceph专用网络 sudo docker network create ...

  2. Java并发(二十三)----同步模式之保护性暂停

    1.定义 即 Guarded Suspension,用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject 如果有结果不断从 ...

  3. 【Flink入门修炼】1-1 为什么要学习 Flink?

    流处理和批处理是什么? 什么是 Flink?为什么要学习 Flink? Flink 有什么特点,能做什么? 本文将为你解答以上问题. 一.批处理和流处理 早些年,大数据处理还主要为批处理,一般按天或小 ...

  4. Flink CDC实时同步PG数据库到Kafka

    一.安装规划 操作系统 服务器IP 主机名 硬件配置 CentOS7.6 192.168.80.131 hadoop01 内存:2GB,CPU:2核,硬盘:100GB CentOS7.6 192.16 ...

  5. [Ngbatis源码学习][SpringBoot] ApplicationContextInitializer接口类的使用和原理解读

    ApplicationContextInitializer接口类的使用和原理解读 在看Ngbatis源码的过程中,看到了自定义的ApplicationContextInitializer实现类,对Ap ...

  6. 【Unity3D】使用GL绘制线段

    1 前言 ​ 线段渲染器LineRenderer.拖尾TrailRenderer.绘制物体表面三角形网格从不同角度介绍了绘制线段的方法,本文再介绍一种新的绘制线段的方法:使用 GL 绘制线段. ​ G ...

  7. Oracle 表压缩(Table Compression)技术介绍

    Oracle 表压缩(Table Compression)介绍 1.官方文档说法: As your database grows in size, consider using table compr ...

  8. centos6关闭防火墙

    service iptable status     --查看防火墙状态 servcie iptables stop     --临时关闭防火墙 chkconfig iptables off      ...

  9. SQLite 入门教程

    不是 MySQL 用不起,而是 SQLite 更有性价比,绝大多数的 Web 应用 SQLite 都可以满足. SQLite 是一个用 C 语言编写的开源.轻量级.快速.独立且高可靠性的 SQL 数据 ...

  10. 突破Windows的极限

    偶然碰到这类技术博客,甚感欣慰,但奈何技术水平达不到,很多都难以理解,故记录在此,用作日后学习. 国内有类似的中文翻译,比如:突破Windows极限:物理内存 但是外文链接已经失效,看不到原汁原味的英 ...