Tomcat内存溢出,关于线程和线程池的一些思考
本文大部分来自网上,由博主总结。
什么是线程
线程,是程序执行的最小单元
。一个标准的线程由线程ID
,当前指令指针
,寄存器集合
和堆栈
组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位
,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。以上概念来自于百度百科。对于开发者来说,线程就是帮我们干实事的家伙
。
必须要了解的并行和并发
- 并发是两个任务可以在重叠的时间段内启动,运行和完成。并行是任务在同一时间运行。
- 例如,在多核处理器上。并发是独立执行过程的组合,而并行是同时执行(可能相关的)计算。
- 并发是一次处理很多事情,并行是同时做很多事情。
- 应用程序可以是并发的,但不是并行的,这意味着它可以同时处理多个任务,但是没有两个任务在同一时刻执行。
- 应用程序可以是并行的,但不是并发的,这意味着它同时处理多核CPU中的任务的多个子任务。一个应用程序可以即不是并行的,也不是并发的,这意味着它一次一个地处理所有任务。
- 应用程序可以即是并行的也是并发的,这意味着它同时在多核CPU中同时处理多个任务。
当然多核cpu处理的任务下,更为复杂。单核cpu的话只能是并发,多核cpu才能做到并行执行。
说白了,在单核cpu下,我们肉眼看到的是多个任务在同时执行,其实是cpu快速切换造成的假象。因为它的速度足够快。我们无法辨别。
多核cpu才能真正的做到多个任务同时处理!题外话
:在大学期间,学习计算机原理时,我们指的都是单核cpu,是将多核排除在外的。此间有很多专有名词,比如:时间分片。还有很多cpu处理任务过程的算法等等。
什么是多线程
我们知道一个进程可以包含多个线程,个任务就是一个线程 ,但实际上,一个应用程序为了同时执行多个任务提供运行效率,一般会涉及到一个线程以上的数量。如果,一个应用程序有一个以上的线程,我们把这种情况就称之为多线程。 本质来说,多线程是为了使得多个线程完成多项任务,以提高系统的效率。目前为止我们使用多线程应用程序的目的是尽可能多地使用计算机处理器资源(本质是为了让效率最大化)。所以,看起来我们仅需要为每个独立的任务分配一个不同的线程,并让处理器确定在任何时间它总会处理其中的某一个任务。但是,这样就会出现一些问题,对小系统来说这样做很好。但是当系统越来越复杂时,线程的数量也会越来越多,操作系统将会花费更多时间去理清线程之间的关系。为了让我们的程序具备可扩展性,我们将不得不对线程进行一些有效的控制。
线程池
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合
,然后在需要执行新的任务时重用这些线程而不是新建一个线程
(提高线程复用,减少性能开销)。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中然后等待下一次分配任务
。
线程池的作用
线程池作用就是限制系统中执行线程的数量。根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
由此分析,上次提到的代码中,应该使用第二种方案去解决。这样更符合线程池的原理。