线程创建后会进入就绪状态,等待cpu的时间片轮到他就进入运行状态,如果线程需要访问io或者等待资源就会进入阻塞状态,那么在多线程竞争的情况下,cpu怎么选择下一个要运行的线程?这里就涉及线程的调度策略了,为了让每个线程都能被及时响应,cpu需要公平的快速的轮询每个线程同时有些线程喜欢优先被执行,那就需要提高优先级,有了优先级就会有了插队的情况,就会出现线程饥饿,操作系统是怎样平衡这个需求?
其实线程每次调用schedule函数那些没有被选中的线程优先级都会被增加一次,这样越久没有被宠幸的线程优先级就会越高,下一次就越容易被选上,线程之间是如何同步的?
比如司机需要等待售票员关门才能启动车辆,线程间通过信号量的方式进行同步,比如在内核级别就是通过pv操作来实现同步的,对应到java中就是通过synchronize 或者是lock support的park,unpark来实现同步
说到调度,线程调度操作系统是时间片轮询,怎么裂解jvm的抢占线程调度