java线程调度
线程调度主要有两种方式,协同式线程调度和抢占式线程调度。
1、协同式:
线程的执行时间由线程本身来控制,线程把自己的任务执行完之后,才会主动通知系统切换到另外一个线程中。
优点:实现方式简单,切换操作对自己可知,没有线程同步的问题
缺点:线程执行时间不可控制,如果线程编写有问题,会一直阻塞,相当不稳定。
2、抢占式:
线程将有系统来分配执行时间,线程切换不是有本身来确定,除了调用Thread.yied()来让出cpu资源。
优点:执行时间系统可控,不会导致阻塞的问题。java就是抢占式调度
java线程有10个优先级,可以设置优先级来建议系统的线程调度,但不是很靠谱,因为java线程还是通过映射到系统的线程上实现的,所以最终还是取决于操作系统。而且优先级可能会被系统自行改变。
线程状态
java中定义了5中线程状态,在任意一个时间点,一个线程只有其中的一种状态。
(1)新建(New) 创建后尚未启动。
(2)运行(Runnable):包括了操作系统线程状态中的Running和Ready,即处于这个状态的线程可能正在执行,也可能是等待cpu分配执行时间。
(3)无限期等待(Waiting):出于该状态时,线程不会被分配cpu执行时间,要等待被其他线程显式地唤醒。有几个方法会让线程陷入这种状态:a.没有超时时间的Object.wait() ;b.没有超时时间的Thread.join(); c.LockSupport.park().
(4)限期等待(Timed Waiting):出于这种状态的线程也不会被分配cpu执行时间,不过无需被其他线程显式地唤醒,一定时间后就可以由系统自动唤醒。有几个方法可以使线程进入这种状态:a.Thread.sleep(); b.设置了超时时间的Object.wait(); c.设置了超时时间的Thread.join(). d.LockSupport.parkNanos(); e.LockSupport.parkUntil().
(5)阻塞(Blocked):线程被阻塞了,与等待状态的区别是,阻塞状态在等待获取到一个排他锁,就是等待另一个线程放弃这个锁。而等待状态则是在等一段时间,或者唤醒动作的发生。在线程等待进入同步区域的时候,线程将进入这种状态。
(6)结束(Terminated):线程已经结束执行。