- 前言
- 1.对线程的管理更加的规范化
- 2.降低创建线程和销毁线程的开销
前言
之前对于Java线程池的理解,一直停留在:对于Java中的多线程机制来说,如果不使用线程池的话,线程的使用就会变得杂乱无章。这一步。一直没有深入去理解为什么其更深层次的原因,今天来仔细思考一下,并记录我自己的理解。
1.对线程的管理更加的规范化
如果不使用线程池的话,对于一个系统来说,最多可以使用多少个线程,每个线程最多可以被占用多长时间避免别的任务产生“饥饿”问题都是不好被控制的,可能需要自己编写相应的逻辑来控制,但是如果使用了线程池的话,我就可以规定这个系统所使用的线程都不能自己创建,都只能从这个线程池中来获取,所以我可以使用这个线程池对这个系统会用到的所有线程进行一个统一的管理。
包括以下几个部分的管理:
1.限制最大的线程数量:,防止系统可以获得的线程数量过多,从而导致CPU的大部分时间都用在了切换线程上,而用在处理线程中的任务上的时间所剩无几,降低了效率。同时,如果不限制最大线程数量的话,很有可能导致OOM(OUT OF MEMORY)问题,因为每个线程都是在内存中开辟一个线程栈(Java中的栈空间是JVM控制的,总共就只有那么大。)还会创建一个线程控制块的。
2.代替手动管理: 对于一个线程来说,它的创建、启动、关闭如果全靠程序员去手动管理的话,手动管理起来会非常复杂,还有可能管理不当发生死锁的问题,所以线程池封装了线程管理的机制,代替程序员去更好地管理线程。
3.
2.降低创建线程和销毁线程的开销
试想一下,如果没有线程池,那么我每次想要完成一个任务都要创建一个线程,然后在该任务完成之后再将其销毁。
但是要知道线程在创建的时候计算机会在JVM给它规定的线程栈空间中挑出一块合适的内存分配给它,并且还会创建一个线程控制块、执行系统调用指令、在操作系统的线程控制表里维护线程队列…这些操作都会耗费CPU的时间(这些操作也可以叫做线程自身的上下文)。并且在销毁的时候也是,OS 需要释放它占用的栈内存、线程控制块、内核对象。这些都会需要CPU的时间。很浪费性能。
而使用了线程池之后,一切就不一样了。线程池创建 固定数量的线程,当有任务到来时,直接复用现有线程,而不是每次都创建新线程。这样就避免了频繁的系统调用、内存分配、CPU 上下文切换。