1、首先需要掌握进程与线程的区别和联系:
a、进程是系统资源分配的最小单位,线程是程序执行的最小单位;
b、进程使用独立的数据空间,而线程共享进程的数据空间;
2、线程调度,简单了解线程的几种调度算法就可以了。比如时间片轮转调度、先来先服务调度、优先级调度、多级反馈队列调度以及高响应比优先调度。
a、线程调度,也就是线程控制。线程的执行是由操作系统和cpu来管理,但是也不能完全不受我们的控制,因此Java提供三个方法来控制线程。
2-1:休眠 sleep();
2-2:释放资源yield()
a) 线程释放掉资源后,自己也马上去争夺cpu资源,所以释放资源并不代表本线程就延后执行。
b) 容易被误用,尽量不使用该方法。
2-3:挂起方法join();
a) 挂起当前线程,让出cpu资源,让其他线程执行完毕后,再来执行当前线程。
调度模式:
1.分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
2.抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
调度算法:
1、时间片轮转调度
算法实现原理是,按进程到达顺序(FCFS 原则)将进程依次加入就绪队列当中,然后将 CPU 分配给位于队首的进程,确定一个时间片,让该进程执行一个时间片。当该进程执行时间到时,该进程可能已经执行完毕(可能在时间片未到时就以及执行完毕),或者未执行完毕,如果是前者只需将进程弹出队列即可,如果是后者则将该进程加入队尾,并将 CPU 分配给新的队首进程,如此循环。
参考网址:https://www.cnblogs.com/rese-t/p/8067210.html
2、先来先服务调度
先来先服务算法是最简单的调度算法,既可以用于作业调度 ,也可以用于程序调度,当作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,优先从后备队列中,选择一个或多个位于队列头部的作业,把他们调入内存,分配所需资源、创建进程,然后放入“就绪队列”,直到该进程运行到完成或发生某事件堵塞后,进程调度程序才将处理机分配给其他进程。
先来先服务算法的服务要领是:按照进程进入就绪队列的先后顺序调度并分配处理机执行。先来先服务调度算法是一种非抢占式的算法,先进入就绪队列的进程,先分配处理机运行。一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某事件发生而不能继续运行时才释放处理机。
参考网址:https://www.cnblogs.com/daheww/p/10154455.html
3、线程池优先级调度 参考网址:https://blog.csdn.net/kaichao/article/details/46378095?utm_source=blogxgwz7
线程优先级调度 参考网址:https://www.cnblogs.com/shamao/p/10860174.html
4、多级反馈队列调度 参考网址:https://www.cnblogs.com/Roni-i/p/10291822.html
5、高响应比优先调度 参考网址:https://www.cnblogs.com/zhizhizhizhiya/p/12768728.html
在进程与线程部分还有一个比较常见的考察点,就是进程间通信,也就是 IPC。需要了解这 6 种进程通信方式的原理与适用场景。例如,进程间数据共享的场景可以使用共享内存;进程间数据交换的场景可以使用 Unix Socket 或者消息队列。
https://blog.csdn.net/ludan_xia/article/details/105653707
https://www.cnblogs.com/liugh-wait/p/8533003.html
协程部分,简单了解协程更轻量化,是在用户态进行调度,切换的代价比线程上下文切换要低很多就可以了,也可以了解 Java 的第三方协程框架,例如 Kilim、Quasar 等。