参考,欢迎点击原文: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. Linux学习资料锦集

    Linux  学习资料链接: (1)Linux常见命令及其用法_STM32李逼的博客-CSDN博客 (2)Linux命令了解_STM32李逼的博客-CSDN博客 3)Linux使用编辑器_STM32李 ...

  2. NVME(学习笔记_杂谈)

    NVME 协议中一些概念的理解: 1.Namespace :可以将Namespace 理解为一片Logic Block的区域,一个Controller可以支持多个Namespace,每个Namespa ...

  3. Java设计模式-组合模式Composite

    介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. 组合模式依据树形结构来组合对 ...

  4. spring boot使用拦截器修改请求URL

    假如我要将请求路径中/foobar都去掉? 1.定义拦截器 package com.laoxu.test.helloweb; import org.springframework.stereotype ...

  5. golang读取用户名和密码文件并生成笛卡尔积

    密码爆破时需要读取用户名字典和密码字典来生成笛卡尔积派发爆破任务:直接读取全部字典内容到内存时成本较高: package main import ( "bufio" "f ...

  6. [BUUCTF][Web][极客大挑战 2019]LoveSQL 1

    打开靶机url,页面显示有两个输入框,框中输入123',发现两个框都有sql注入问题 爆出一下错误 You have an error in your SQL syntax; check the ma ...

  7. AirtestProject浅尝辄止

    AirtestProject是什么 AirtestProject是由网易游戏推出的UI自动化测试解决方案,主要包含3部分内容: 1.Airtest框架:跨平台的,基于图像识别的UI自动化测试框架,支持 ...

  8. 使用winsw将jar包注册成windows服务

    使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...

  9. FastAPI中全局异常处理

    装饰器版本自定义异常 1.首先我们定义三个文件,分别为exception.py,main.py, user.py 2.自定义异常需要继承HTTPException,该异常可以从fastapi中直接导入 ...

  10. 【LeetCode二叉树#08】寻找树左下角的值(回溯机制X深度)

    找树左下角的值 力扣题目链接(opens new window) 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 示例 2: 思路 层序遍历 这个是很自然的思路,因为层序遍历可以避免对于& ...