1. 多线程
多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力
2. 线程池的作用
线程池技术正是关注如何缩短或调整创建线程、销毁线程时间的技术,从而提高服务器程序性能的
a) 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
b) 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
自定义线程池:ThreadPoolExecutor:创建自定义线程池,自定义线程池
ArrayBlockingQueue:有界缓存等待队列,可以指定缓存队列的大小,当正在执行的线程数等于corePoolSize时,多余的元素缓存在ArrayBlockingQueue队列中等待有空闲的线程时继续执行
// 创建数组型缓冲等待队列
BlockingQueue<Runnable> bq = new ArrayBlockingQueue<Runnable>(20);
// ThreadPoolExecutor(自定义线程池):池中运行的线程数,允许最大挂起的线程数,线程销毁时间,线程销毁时间格式,队列保留
ThreadPoolExecutor tpe = new ThreadPoolExecutor(1, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, bq);
线程中可用的时间格式:
TimeUnit.DAYS//天
TimeUnit.HOURS//小时
TimeUnit.MINUTES//分钟
TimeUnit.SECONDS//秒
TimeUnit.MILLISECONDS//毫秒
对自定义线程池的四种定义
a. 可回收缓存线程池:newCachedThreadPool(同时运行线程数:无限大,最大挂起线程数:无限大 线程销毁时间:60S )
队列方式 SynchronousQueue:没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。
//创建一个可缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
b.可控最大并发数线程池:newFixedThreadPool (同时运行线程数:参数 最大挂起线程数:参数 线程销毁时间:运行完后直接销毁)
队列方式 LinkedBlockingQueue :无界缓存等待队列。当前执行的线程数量达到corePoolSize(参数*2)的数量时,剩余的元素会在阻塞队列里等待
//可重用固定个数的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
c.定时与周期性任务线程池:newScheduledThreadPool(同时运行线程数:参数 最大挂起线程数:无限大 线程销毁时间:运行完成直接销毁)
队列方式 DelayedWorkQueue :优先级队列,只能用来存储RunnableScheduledFutures任务。堆是实现优先级队列的最佳选择,而该队列基于堆数据结构的实现
//定长线程池,支持定时及周期性任务执行——定期执行
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
//initialDelay:延迟秒数,period:执行间隔 unit:时间格式
scheduledThreadPool.scheduleAtFixedRate(reviewStatus, 0, 3, TimeUnit.SECONDS);
d.单线程化线程池:newSingleThreadExecutor (同时运行线程数:1个 挂起线程数量:1个 线程销毁时间:运行完成直接销 毁)
队列方式 LinkedBlockingQueue:无界缓存等待队列。当前执行的线程数量达到corePoolSize(参数*2)的数量时,剩余的元素会在阻塞队列里等待
//单线程化的线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();