多线程三~

一、线程的划分

JAVA中的线程分为两种:守护线程(daemon)、用户线程(user)。

守护线程也可以称为“服务线程”,表示在没有用户线程可以服务的时候自行离开;守护线程的优先级比较低,是为系统中的其他对象和线程提供服务的;通过Thread.setDaemon(true)来设置线程为守护线程,将一个用户线程设置为守护线程的方式是线程启动用线程对象的setDaemon方法。

在JVM启动的时候会调用main函数,main函数所在的线程就是一个用户线程,这个是可以看到的线程,但是其实JVM在启动的时候,内部还会启动很多的守护线程,比如垃圾回收线程。

两者的区别在于:当最后一个用户线程结束的时候,JVM会正常退出,不管是否还存在守护线程,也就是说守护线程的结束与否不影响JVM的退出。故只要还有一个用户线程没有结束,在正常情况下JVM是不会退出的。

二、线程调度与线程的优先级

1、线程调度(线程调度有两种模型)

分时调度模型:所有线程轮流使用CPU的执行权,平均分配每个线程占用CPU的时间片

抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,则随机选择一个,优先级高的线程获取CPU的时间片相对多一些。(JAVA采用的线程调度模型)

2、线程优先级

线程的优先级范围是1-10,默认的优先级是5。线程的优先级高仅仅表示其获取CPU时间片的几率大一点。

getPriority():获取线程对象的优先级

setPriority():设置线程对象的优先级 

线程的优先级具有继承性:假如A线程继承B线程,则这两个线程的优先级相同。

线程的优先级具有规则性:CPU总是尽量将执行资源让给优先级高的线程。

线程的优先级具有随机性:优先级较高的线程并不是每一次都先执行完,线程的优先级和打印顺序无关,他们之间的关系具有随机性和不确定性。

猜你喜欢

转载自blog.csdn.net/qq_40303781/article/details/85266421