线程池概念及实现简单的线程池 |
您所在的位置:网站首页 › 线程池怎么实现的 › 线程池概念及实现简单的线程池 |
线程池概念及实现简单的线程池 本文主要介绍线程池的概念,原理,以及简单实现一个线程池,若文中有不足或错误之处,请指出(ps:感激涕零,不要让我陷入错误的误区。。。) 一:线程池的基本概念和原理在此之前,先来思考一个问题,为啥要用线程池呢? 线程越多,不一定就会执行的越快,受到CPU的影响,我们要控制线程的数量,线程池它的一个作用,就是用来管理线程的数量的。一般在计算机中,线程的数量是CPU数量的1到2倍。 线程池主要有下面几部分组成: 1:线程池管理器。用来管理线程池的,主要可以创建线程池,销毁线程池等。 2:工作线程。执行任务的线程,可以循环的去执行不同的任务。 3:任务接口。必须要去实现的接口,主要用来线程的调度,任务的收尾以及任务的状态等。 4:工作队列。存放任务的队列。 实现一个线程池,首先需要知道线程池的基本原理,我们知道线程池有个顶级接口Excutor,初始化一个线程池,有以下几个参数需要了解: ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor( 5, //核心线程数 10, //最大线程数 5, //若最大线程数5s内没有任务执行,就销毁 TimeUnit.SECONDS, //时间单位 new LinkedBlockingDeque() //队列);1:核心线程数,线程池的核心线程,当有任务提交过来的时候就创建一个线程,执行任务。 2:工作队列,当核心线程数量达到我们设置的值时,就去判断工作队列是不是已经满了,要是没满,就把任务放入工作队列。 3:最大线程数,当工作队列已满,这时候就看是否达到了最大线程数,要是没有,就建立线程执行任务,要是达到了最大线程数,就执行拒绝策略。 在实现之前,需要思考:实现线程池,需要去实现什么?怎么实现?需要做什么事情? 根据上面的介绍知道,实现一个线程池,肯定需要一个队列去存放任务,还需要一个集合去存放线程: /** 需要一个任务队列,用来存放任务 */private BlockingDeque blockingDeque;/** 需要一个集合,存放工作线程 */private static List workerList;那么接下来还需要做什么呢?既然任务队列和线程都有了,接下来就是从任务队列拿任务,然后线程循环的去执行任务: /** 工作线程执行任务,需要可以循环的执行 */public class Worker extends Thread {private ThreadPoolDemo threadPool;//构造方法public Worker(ThreadPoolDemo pool) {this.threadPool = pool; } @Overridepublic void run() {//判断条件,线程是否关闭,任务队列中是否还有任务while (isWorker == false || blockingDeque.size() > 0) { Runnable task = null;try {if (isWorker) {//非阻塞task = blockingDeque.poll(); } else {//阻塞task = blockingDeque.take(); } } catch (InterruptedException e) { e.printStackTrace(); }if (task != null) { task.run(); } } } }下面就是初始化线程池的方法了,指定线程的数量,队列的大小等: /** 初始化一个线程池 * 传入参数:线程数,工作队列数 */public ThreadPoolDemo(int threadSize, int queueSize) {//初始化队列blockingDeque = new LinkedBlockingDeque(queueSize);//初始化工作线程集合(线程安全的)workerList = Collections.synchronizedList(new ArrayList());for (int i = 0; i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |