线程的实现方式
线程主要有三种实现方式:使用内核线程实现(1:1实现),使用用户线程实现(1:N实现),使用用户线程加轻量级进程混合实现(N:M实现)
Java线程实现
JDK1.3之后,采用内核线程实现的方式实现JAVA线程。
java线程调度模式
线程调度主要有两种模式:一种是协同式线程调度,另一种是抢占式线程调度。
协同式线程调度的多线程系统,线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动同志系统切换到另一个线程上去。好处是实现简单,坏处就是时间不可控制,可能某些任务阻塞了线程,一直无法释放占用线程资源。
抢占式线程调度,线程由操作系统来分配执行时间,线程切换不由线程本身决定,Java语言使用的是抢占式线程调度。(java语言设置了10个线程优先级,优先级越高的线程越容易被系统执行)
线程状态转换
Java语言定义了6种线程状态,在任意时间点,一个线程只能有一种状态,并且可以通过特定的方法进行线程状态的切换。
- 新建(New):创建后尚未启动的线程处于这种状态。
- 运行(Runnable):包括操作系统线程状态种的Running和Ready。
- 无限期等待(Waiting):处于这种状态的线程不会被分配处理器执行时间,他们要被其他线程显示唤醒。
- 限期等待(Timed Waiting):处于这种状态的线程也不会被处理器分配执行时间,不过无序等待被其他线程显示唤醒,在一定时间后会自动唤醒。
- 阻塞(Blocked):线程被阻塞了,阻塞状态和等待状态区别是,阻塞状态在等待获取一个排他锁,这个事件将在另一个线程放弃这个锁的时候发生,而等待状态则是等待一段时间或者等其他线程唤醒动作的时候发生。
- 结束(Terminated):已终止的线程状态,表示线程已经执行结束。
协程
内核线程调度的开销主要来源于内核态和用户态之间的状态转换,而这两种状态的转换的开销主要来自于响应中断、保护和恢复执行现场的成本。
用户线程的出现改善了线程切换的问题,起初的用户线程采用协同是调度,所以他有一个别名叫做“协程”。
协程的主要优势是轻量级,局限就是应用层实现的内容比较多,因为所有的线程状态的操作都要用户自己实现。