文章目录[隐藏]
一个线程的周期分为:bai创建、运du行、销毁三个阶段。 处理一个任务时,首先创建一zhi个任务线程dao,然后执行任务,完了,销毁线程。而线程处于运行状态的时候,才是真的在处理我们交给它的任务,这个阶段才是有效运行时间。所以,我们希望花在创建和销毁线程的资源越少越好。如果不销毁线程,而这个线程又不能被其他的任务调用,那么就会出现资源的浪费。为了提高效率,减少创建和销毁线程带来时间和空间上的浪费,出现了线程池技术。这种技术是在开始就创建一定量的线程,批量处理一类任务,等待任务的到来。任务执行完毕后,线程又可以执行其他的任务。等不再需要线程的时候,就销毁。这样就省去了频繁创建和销毁线程的麻烦。
一. 线程池简介
1. 线程池的概念:
在面向对象编程中,对象创建和销毁是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源.
线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
2. 线程池的工作机制
在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。
一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
3. 使用线程池的原因:
多线程运行时间,系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。
4、一个线程池包括以下四个基本组成部分:
(1)线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
(2)工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
(3)任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
(4)任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
二. 线程池优缺点
线程池具有以下优点:
用现有线程服务请求比等待创建一个线程更快。
线程池限制了任何时候可用线程的数量。这对那些不能支持大量并发线程的系统非常重要。
将要执行任务从创建任务的机制中分离出来,允许我们采用不同策略运行任务。例如,任务可以被安排在某一个时间延迟后执行,或定期执行。
可以重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。
能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。
能够对线程进行简单的管理(关闭、回收等),并提供定时执行以及指定间隔循环执行等功能。
池内线程的数量可以通过一些因素来加以估算,如系统 CPU 的数量、物理内存的大小和并发客户请求数量的期望值等。更为高级的线程池架构可以根据使用模式动态调整池内线程数量。这类架构在系统负荷低时,提供了较小的池,从而减低内存消耗(如 Apple的大中央调度)。
线程池缺点
创建太多线程,将会浪费一定的资源,有些线程未被充分使用。
销毁太多线程,将导致之后浪费时间再次创建它们。
创建线程太慢,将会导致长时间的等待,性能变差。
销毁线程太慢,导致其它线程资源饥饿。
三、线程池大类总共分为4种
fixThreadPool 正规线程(传统线程池)创建固定个数的线程池,超出的线程会在队列中等待,如有发生异常的线程,会自动创建一个新线程。
cacheThreadPool 缓存线程池创建一个缓存的线程池,如果有之前的线程可以使用,则使用,否则创建。休闲时间超过60秒的线程将被废弃。
singleThreadPoll 单线程线程池(单例线程池)创建一个只有一个单一线程的线程池,保证执行有序性,如有发生异常的线程,会自动创建一个新线程。
ScheduledThreadPoll 周期性执行任务的线程池,此线程池支持定时及周期性执行任务的需求。
四、多线程
多线程的优点
1、提高CPU的使用率
例如朋友圈发表图片,当你上传9张图片的时候,如果开启一个线程用同步的方式一张张上传图片,假设每次上传图片的线程只占用了CPU 1%d的资源,剩下的99%资源就浪费了。但是如果你开启9个线程同时上传图片,CPU就可以使用9%的资源了。
2、提高程序的工作效率
还是拿朋友圈发表图片来说,假设开启一个线程上传一张图片的时间是1秒,那么同步的方式上传9张就需要9秒,但是你开启9个线程同时上传图片,那么就只需要1秒就完成了。
多线程的缺点
1、如果有大量的线程,会影响性能,因为CPU需要在它们之间切换。
2、更多的线程需要更多的内存空间。
3、多线程操作可能会出现线程安全或者死锁等问题。
多线程并行和并发的区别
概念
并行:多个处理器或者多核处理器同时执行多个不同的任务。
并发:一个处理器处理多个任务。
打个比喻
并行就是一个人用他的左手喂女儿吃饭,同时用右手喂儿子吃饭。
并发就是一个人先喂女儿吃一口饭,接着喂儿子吃一口,然后再喂女儿吃一口,轮流喂。
五、 线程池与多线程的区别
线程池是在程序运行开始,创建好的n个线程,并且这n个线程挂起等待任务的到来。而多线程是在任务到来得时候进行创建,然后执行任务。
线程池中的线程执行完之后不会回收线程,会继续将线程放在等待队列中;多线程程序在每次任务完成之后会回收该线程。
由于线程池中线程是创建好的,所以在效率上相对于多线程会高很多。
线程池也在高并发的情况下有着较好的性能;不容易挂掉。多线程在创建线程数较多的情况下,很容易挂掉。