线程 ——Thread。
在java的生态中,并不是很鼓励使用多进程编程,更鼓励使用多线程编程。
引入多进程的初心是实现并发编程,多核CPU的时代。(刚需)
但是多进程编程模型,也有明显的缺点:
进程太重量,效率不高
创建一个进程,消耗时间比较多;
(消耗在申请资源上,进程是资源分配的基本单位)
分配内存操作,就是一个大活。
操作系统内部有一定的数据结构,把空闲的内存分快管理好。
当我们去进行申请内存的时候,系统就会从这样的数据结构中找到一个大小合适的空闲内存,返回给对应的进程。
这里虽然通过此处的数据结构,可以一定程度提高效率,整体来说,管理的空间比较多,相比之下还是一个耗时操作。
销毁一个进程,消耗的时间比较多;
调度一个进程消耗的时间比较多;
为了解决上述问题,就引入了"线程" Thread
线程也叫做"轻量级进程"
创建线程,比创建进程更快;
销毁线程,比销毁进程更快;
调度线程,比调度进程更快;
线程的特点:
1.每个线程都可以独立的去CPU上调度执行。
2.同一个进程的多个线程之间,公用一份内存空间和文件资源
(创建线程的时候,不需要重新申请资源了,直接复用之前已经分配给进程的资源,省去了资源分配的开销,于是创建效率就更高了)
虽然线程可以提高效率,但是也不是说
线程的数目越多越好。
当线程数目过多,效率无法进一步的提升了,反而会因为要调度的线程太多了,使调度的开销更大,反而会降低效率。
而且,当线程数目多了,可能会产生一定的冲突!!(线程不安全问题)
一个线程抛出异常,如果没有妥善处理就容易把整个进程带走(崩溃),此时其他线程自然也就随之消亡。
进程和线程的区别:
1.进程包含线程,一个进程里面可以有一个线程,也可以有多个线程。
2.进程和线程,都是用来实现并发编程场景的,但是线程比进程更轻量,更高效。
3.同一个进程的线程之间,共用一份资源(内存+硬盘),省去了申请资源的开销。
4.进程和进程之间,是具有独立性的,一个进程挂了不会影响到别人。
但是线程和线程之间(前提是同一个进程内),是可能会相互影响的。(线程安全问题+线程出现异常)
5.进程是资源分配的基本单位,线程说调度执行的基本单位。