线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同式线程调度和抢占式线程调度。
协同式线程调度,线程的执行时间由线程本身控制。协同式线程调度,线程执行时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另外一个线程上。
抢占式调度,每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。
Java中,Thread.yield()可以让出执行时间,但无法获取执行时间。
优点:线程执行时间系统可控,也不会有一个线程导致整个进程阻塞。
如果希望系统能给某些线程多分配一些时间,给一些线程少分配一些时间,可以通过设置线程优先级来完成。 Java语言一共10个级别的线程优先级(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在两线程同时处于ready状态时,优先级越高的线程越容易被系统选择执行。但优先级并不是很靠谱,因为Java线程是通过映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统。
Java定义了5种线程状态,在任意一个点一个线程只能有且只有其中一种状态。无限等待和等待可以算在一起。所以共五种。
object.wait()
方法和Thread.join()
方法,以及LockSupport.park()
方法。 Thread.sleep()
,设置了timeout的object.wait()
和thread.join()
,LockSupport.parkNanos()
以及LockSupport.parkUntil()
方法。 线程状态转换关系