Java线程池-线程复用原理(白话篇)

来源:互联网 发布:微信 打开淘宝客户端 编辑:程序博客网 时间:2024/06/06 00:39
随便吐槽两句
今天无意中手贱看了点线程池原理的资料,结果被线程池里的线程复用机制给绊住了,死活想不通是怎么管理和重复使用线程的,因为一个线程内容执行完毕后就会自动销毁,就算把线程停住了,你再怎么去控制给这个线程里添加任务呢?正所以死胡同就是这样不知不觉中钻进去。自己想不明白,上度娘上去找一找呗,结果让我的郁闷指数更上多层楼,度娘的线程池线程复用原理相关“奶水”大致也就两个味道:模棱两可和高深莫测,通俗点讲就是要么看了等于白看,要么就是看了半天发现脑子更晕(面向对象思想如果不是炉火纯青的童鞋建议就别钻牛角尖了),最后经过我努力深度钻研,大脑中反复推敲,终于转过弯了。我决定用通俗易懂的语言描述分享出来,造福后人,虽然我知道文字描述真的是不容易......
正文
线程池的核心其实就是队列和线程复用机制,搞懂这两个板块那么离自己手写一个线程池就只有一步之遥了。顺便解释下什么叫队列吧,免得有的童鞋还要去找度娘(主要针对小白,有一定基础的童鞋自行跳过)。
队列:最白话的形容就是集合、数组(看到这两个词是不是有种醍醐灌顶的感觉?),当你把数据、函数、变量、对象等等一切能存放的东西存放到里面,是不是就可以有序的去控制它?这就是最基本的队列。
线程复用机制其实也是如队列一样的简单,什么东西一旦说破了、想明白了也就觉得没什么了,正所谓难者不会、会着不难。那么线程的复用机制到底是怎样的呢?我们在脑海里来模拟一下连接池,打个比方,项目经理管理着10个程序员干活,每个人干什么活,什么时候干,干多久,都由项目经理安排。线程池就相当于项目经理,需要10个程序员干活,就招了10个程序员,而程序员就是线程池里的线程,那么各位童鞋肯定要问了,项目经理给程序员安排工作可以直接告诉他们,那么线程池是如何告诉线程的呢,毕竟程序又不是人。这里就考验各位童鞋的面向对象思想了,须知万事万物皆对象。

说了半天稀的了,该上干的了
线程池首先他本身就是一个线程,这个线程就是用于管理布控整个线程池里的各种任务和事务,例如创建线程、销毁线程、任务队列管理、线程队列管理等等。
首先,线程池会有一个管理任务的队列,这个任务队列里存放的就是各种任务,线程池会一直不停循环的去查看消息队里有没有接到任务,如果没有,则继续循环,如果有了则开始创建线程,如果给这个线程池设定的容量是10个线程,那么当有任务的时候就会调用创建线程的函数方法去根据当前任务总数量依次创建线程(这里创建线程的函数方法都是你提前些好了的,在此提醒脑子没转弯过来的童鞋),线程中会写好循环获取任务队列里任务的逻辑、判断是否销毁该线程的逻辑、进入等待的逻辑,这样线程一旦创建出来就会循环的去查询任务队列里的任务,拿到任务后就执行,执行任务完毕后判断是否销毁该线程,如果不销毁就进入等待(sleep),等待时间过后继续查询消息是否有任务,如此循环,直到逻辑判断需要销毁该线程为止(一般都是根据设定时间去判断是否销毁,例如在线程创建的时候设置一个计时器去控制,如果180秒都没有接到新的任务,则销毁该线程)
大致思路就是以上内容,如果觉得不错,记得点赞!

原创粉丝点击