线程池? 如何设计一个动态大小的线程池,有哪些方法?

【线程池?  如何设计一个动态大小的线程池,有哪些方法?】

线程池:顾名思义就是事先创建若干个可执行的线程放入一个池(容器) 需要的时候从池中获取线程不用自行创建使用完毕不需要销毁线程而是放回池中 从而减少创建和销毁线程对象的开销

系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。此时,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。

与数据库连接池相似,线程池在系统启动时即创建大量空闲的线程,程序将一个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()在保证线程池中有很大一部分线程处于空闲状态,并且空闲状态的线程在小于某一个值时, 减少线程池中线程的个数

原文地址:https://www.cnblogs.com/wangyichuan/p/5967949.html