当进程中有多个线程时,每个线程自身都维护一套自己的寄存器和堆栈,但是不同的线程共用进程的代码段,数据,文件,只是执行的代码位置不同而已,每一个进程至少有一个主线程在执行
线程的优点:
浏览器
线程1显示图像
线程2从网络接收数据
文字处理器
线程1显示图形
线程2读取用户键盘输入
线程3自动定时的保存文档
假如文字处理器是单线程的,用户输入了信息后点击保存,此时线程就会去保存文档,此时用户若是还想输入信息就会发现该文字处理器会停止接收用户输入的信息,等待保存完成后才能继续读取用户键盘输入,用户体验非常差,执行效率差
你也可以同时创建两个进程,进程A用来读取用户键盘输入,进程B用来即时保存文档,但是进程之间共享数据是非常困难的,因为进程之间本身是相互隔离的,开销太大
所以多线程是解决该类问题比较好的方法。
线程的实现:
1.完全在用户层实现
优点:进程切换线程完全不用操作系统内核的介入,运行速度非常快
缺点:从操作系统来看,他就看到的是进程,他看不到具体的线程细节,假如进程1中的某一个线程在读写文件进入到了阻塞状态,操作系统会认为该进程进入到了阻塞状态,会将整个进程放入到阻塞队列中等待唤醒,虽然别的线程没有阻塞但还是被强制结束了
2.在内核中实现线程
一个用户线程对应一个内核线程,内核去完成线程的创建和调度
优点:不会因为进程中某一个线程阻塞,导致整个进程被阻塞
缺点:系统开销比较大
3.用户空间和内核空间混合实现线程
将一些耦合度高的线程在内核空间创建一个线程,低耦合的线程则单独创建线程,这样即可以解决单线程阻塞导致进程阻塞的问题,同时也减少了内核空间中的线程创建的个数,减少了资源开销
jvm用的就是混合方式来管理的
学自:“码农翻身”微信公共号