线程池 基本原理

做个Java开发的小伙伴,或多或少的接触过线程池,但是为什么Java要提供线程池这个工具类呢?相信大家都听说过,线程对象比较重,重是什么意思?大家应该也接触过其他池化技术,比如数据库连接池,那这些池化技术和线程池的原理是否一样呢?我们先来明确一下,重到底是什么意思?一个普通的Java对象,它的创建过程无非就是加载类,在堆内存中分配空间,进行初始化,经过这三步Java对象就创建完成了,而线程对象的创建,除了需要经过这三步,还需要操作系统的配合,真正线程的创建是交给操作系统的,而操作系统创建线程就会用到其他资源(如果学过操作系统,至少应该知道操作系统会维护一个TCB),正是由于操作系统申请了其他资源,所以导致线程对象比普通的Java对象重。而对于这些比较重的对象,但是我们又需要频繁使用,一般我们会选择将它们缓存起来,用的时候申请并使用,不用的时候释放并让它回到缓存中。这就是池化技术,如果在程序中,需要频繁使用比较重的对象,那么一般都会利用池化技术提升性能。一般的池化技术基本上就是提前创建一堆对象,用的时候,拿去用,不用的时候,放回来。但是线程池无法这样设计,虽然从设计上,看上去可行,需要使用线程时,申请一个线程,使用完后,将这个线程放回池中。但是线程有个很致命的问题,线程创建之初,他所需要执行的流程就固定了,无法修改。所以一般的池化技术的设计思路就不可取了,于是Java对于线程池的设计,采用的生产者-消费者模型 生产者是使用线程池的我们,消费者就是线程池中的线程。

使用线程池的我们,通过线程池提供的API,将我们需要执行的任务加入到阻塞队列中,而每个线程都执行着固定的流程,即从阻塞队列中取任务,调用它们的run()方法。这就是Java对于线程池的设计。

不过在日常开发中,创建线程池的时候,推荐使用有界的阻塞队列,但是Java提供的Excutors.newxxxx()这些方法,传入的阻塞队列都是无界的即没有大小限制,很容易导致OOM(内存不够)


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
pandaer
作者分享
你是否也只把 MySQL 当作一个“只会存取数据”的黑盒?前端发请求,你查数据库,看似简单,但当查询变慢、死锁频发时,你是否因为不懂内部原理而无从下手? 本文不讲晦涩的源码,而是像拆解玩具一样,带你钻进 MySQL 内部:从连接器到存储引擎,看清一条 SQL 到底经历了什么;从 Redo Log 到两阶段提交,搞懂数据是如何被安全写入的。别再只做“CRUD”工程师了,今天带你真正看透 MySQL 的本质! 原文如下:https://mp.weixin.qq.com/s/f6loMKH25VWPfkJYl2yAxg
5
  不知道你有没有想过,计算机是如何从一个想法不断演进到今天的呢?   在起初有这样一个想法,“计算”这件事能不能用机器来实现,让机器来帮我们干活呢?这个想法诞生之后,就不断的有人还在开始尝试实现这个想法,其中图灵提出了自己的一个实现思路,也就是现在大名鼎鼎的「图灵机」,但是图灵机仍然无法落地,因为它有一个「无限长纸带」的假设。于是后人在图灵机这个理想的模型上继续演进,其中冯洛伊曼提出的计算机体系结构成为了主流。   在冯洛伊曼体系结构中,计算机所有的一切都由01组成,无论是文本,图片,声音,还是指令;有5大基础组件,运算器,控制器,存储器,输入输出。后人基于冯洛伊曼提出的计算机体系结构,结合数学和物理相关的知识,就制造出了那些我们耳熟能详的计算机硬件,比如CPU,内存,硬盘,各种外设。基于这些计算机硬件我们就可以组装出一台可以运行的计算机了。值得一提的是,在制造计算机硬件的过程中,数学与物理电学相关的部分,衍生出了一个新的学科「数字逻辑」。   到此,一个可运行的计算机就被制造出来了。
5
  MySQL数据页笔记 这种底层数据结构的设计,基本上都有两部分组成,一部分是真实的数据,一部分是描述这些数据的信息,也叫做元信息。   数据页的组成分为这么几个部分   1. file header 校验和 页号 前一条页号 下一条页号   2. page header 下一条记录 删除标识   3. 最大最小记录   4. record data   5. free space   6. page directory slot 二分查找   7. file tail 校验和 与file header一起用作刷盘时数据的完整性校验。
2
  精力拥有四大来源,这四大来源组成了精力金字塔,从底往上分别是体能,情绪,专注,目标意义感。   体能是基础,体能好,尤其是心肺能力好的人,更加不容易疲劳。所以有规律的运动很重要。   情绪,消极的情绪会不断消耗自己的精力,相信你一定深有感受,遇到消极情绪,需要及时走出来,我的做法就是不纠结,不去想。所以保持一个正面的,积极的心情也很重要   专注,指的是专注的思维,是我们常说的专注力,人脑天生对有难度复杂的事情有抗拒感,而且我们一段时间就只能做一件事情   目标意义感,就是要有清晰的目标,明确的计划。
3
  精力是什么? 如果把人比做手机,那么精力就是「电池」,精力决定了你一天可以做多少事情,效率又有多高。精力充沛的人效率高,做事又好又快,而精力低的人不仅效率低,而且完成的事情的质量也不高。所以让我们做一个高精力的人吧!   那么怎样才算是高精力的人?我将精力划分为4个等级,「不堪重负」「积极应对」「全力以赴」「游刃有余」   1. 不堪重负:不仅自己有挫败感,而且还终日疲惫不堪   2. 积极应对:白天的工作可以认真完成,但是一下班,就想睡觉,甚至连娱乐都不想   3. 全力以赴:白天可以认真工作,下班后至少不会只想躺在床上   4. 游刃有余:白天不仅可以认真工作,下班后也可以积极享受生活,或者充电学习   精力除了有这4个等级之外,精力在一天也是波动的,某个时间段精力高,某个时间段精力低。一个可以落地的方法是**在精力高的时候做有难度高专注的事情,做重要的事情**,那如何判断自己的那个时间段精力高呢?自测,将一天分为几个时间段   1. 醒来后两个小时   2. 8~11点   3. 11~13点   4. 13点~15点   5. 15点~18点   6. 18点~20点   7. 20点~23点   在你认为精力最好的时间段打10分,然后再给其他时间段基于此打分,得到一个曲线图。然后在这个曲线图的高点做重要的事情,低点做一些不费脑子的事情。
5
下载 APP