目录
什么是线程?进程?协程?
线程和进程的区别?
多线程的好处:
单核CPU有没有必要上多线程?
为什么没有变成单进程多线程的操作系统?
线程的状态
sleep () 和wait()都是立刻让出CPU 有什么区别?
如何查看线程信息?
什么是线程?进程?协程?
操作系统运行一个程序,就开启了一个进程(比如QQ、微信),在进程内部有很多个线程(比如qq的不同功能);
进程是操作系统管理资源的基本单位;
线程是操作系统调度的基本单位(CPU执行的时间片分配是以线程为基本单位分配。)
协程:( Java里面没有协程)
在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
线程和进程的区别?
举例:
操作系统运行一个程序,就开启了一个进程(比如QQ、微信),在进程内部有很多个线程(比如qq的不同功能);
本质:线程本质上是数组形成的栈,在栈区域每一个线程都会有自己独立的栈,所以当多个线程一块执行时,栈区域会有多个线程栈
作用:
进程是操作系统管理资源的基本单位
线程是操作系统调度的基本单位(CPU执行的时间片分配是以线程为基本单位分配。)
进程分配资源,线程用来调度
关系:
进程间相互独立,一个进程崩溃不影响其他进程;线程相互依存,一个线程崩溃可能导致整个进程崩溃
一个进程包括很多线程,一个进程内可以有多个线程同时执行
同一个进程的各个线程共享这个进程的资源
多线程的好处:
多线程可以更充分的利用多核CPU,降低CPU的浪费,让整体运行起来更快
网络io以及磁盘的请求 ,CPU等待时间过长,应该使用多线程,防止CPU浪费比例过大
CPU浪费比例达到50%的时候用多线程合适,如果CPU浪费比例在5%以下,用多线程不合适
单核CPU有没有必要上多线程?
有,在某些情况下,多线程依然可以提高程序的运行速度,比如
阻塞io的时候,当前线程在阻塞的时间内没有执行,CPU等待时间过长,所以多线程此时可以提高效率
有时候,CPU要执行的任务资源在硬盘里,硬盘到内存再到CPU是有很多时间空闲的,可以用CPU来提供效率。
时间片轮转是会记录当前线程的执行情况的,所以多线程可以更好的使用,更高的效率
为什么没有变成单进程多线程的操作系统?
分配资源是进程为基本单位,这个进程的线程共享这个进程的资源
进程独立任务(进程间相互隔离),就比如酷狗音乐和腾讯视频,是两个进程,是不同的任务
线程的状态
新建(new一个新线程)
就绪(线程start,直接进入就绪态,另外sleep0也是一样的功能)
运行(就绪队列中的线程被操作系统选中)
等待(执行wait)
超时等待
阻塞(竞争锁失败进入阻塞队列)
死亡(线程执行完毕)
线程的状态之间可以相互转换:
就绪态-->运行态(被操作系统选中),
运行态-->就绪态(时间片到了让出CPU)
运行态-->等待态(运行时执行wait)
等待态-->就绪态(通过notify唤醒)
阻塞态-->就绪态(上一个线程让出CPU,从阻塞队列出来进入就绪态重新竞争)
进入等待状态的线程,如果没有其他线程唤醒,那么他会一直处于等待队列中不会进入就绪队列再执行
唤醒方法是notify方法

sleep () 和wait()都是立刻让出CPU 有什么区别?
- sleep()在让出CPU的时候不释放锁(这个线程沉睡不执行的时候,因为有锁,其他线程也别想执行这块资源
- wait()让出CPU的时候立刻让出锁,调用wait()的时候说明事先一定是加了锁
如何查看线程信息?




















