线程池? 如何设计一个动态大小的线程池,有哪些方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池? 如何设计一个动态大小的线程池,有哪些方法?相关的知识,希望对你有一定的参考价值。
【线程池? 如何设计一个动态大小的线程池,有哪些方法?】
线程池:顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中, 需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中, 从而减少创建和销毁线程对象的开销。
系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。此时,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
与数据库连接池相似,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象或Callable对象传给线程池,线程池就会启动一个线程来执行它们的run()或call()方法,当run()或call()方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个Runnable对象的run()或call()方法。
使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统剧烈下降,甚至JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数。
设计一个动态大小的线程池,如何设计,应该有哪些方法?
一个线程池包括四个基本部分:
1 线程管理器(ThreadPool):用于创建并管理线程池,包括创建线程、销毁线程池、添加新任务。
2 工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务。
3 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口、任务执行 完后的收尾工作、任务的执行状态等。
4 任务队列(TaskQueue):用于存放没有处理的任务,提供一种缓冲机制。
所包含方法:
private ThreadPool() 创建线程池
public static ThreadPool getThreadPool() 获得一个默认线程个数的线程池
public void ececute(Runnable task) 执行任务,其实只是把任务加入任务队列,什么时候执行由线程池管理器决定
public void execute(Runnable[] task)批量执行任务,其实只是把任务加入任务队列,什么时候执行由线程池管理器决定
public void destroy() 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁
public int getWork ThreadNumber() 返回工作线程的个数
public int getFinishedTasknumber() 返回已完成任务的个数,这里的已完成是指出了任务队列的任务个数,可能改任务 并没有实际执行完成
public void addThread() 在保证线程池中所有线程正在执行,并且要执行线程的个数大于某一值时,增加线程池中的 线程个数
public void reduceThread()在保证线程池中有很大一部分线程处于空闲状态,并且空闲状态的线程在小于某一个值时, 减少线程池中线程的个数
以上是关于线程池? 如何设计一个动态大小的线程池,有哪些方法?的主要内容,如果未能解决你的问题,请参考以下文章