线程调度分为两种形式
1 分时调度模型: 所有线程轮流获得CPU使用权,平均分配每一个线程的CPU时间片
2 抢占式调度模型: 优先让优先级更高的线程使用CPU,如果线程优先级相同 那机会随机分配优先级 给优先级高的线程更多一些的时间片
而java的分配模式 是抢占式的CPU分配规则
Thread类中 有获取和设置线程的优先级方式
下面我们用代码演示一下
我们先新建一个包 包下新建两个类
customException 线程类 参考代码如下
public class customException extends Thread {
public String name;
public customException(){
}
public void run(){
for(int i = 0;i < 10;i++){
System.out.println(getName()+"第"+(i + 1)+"次输出");
}
}
}
text 测试类 参考代码如下
public class text {
public static void main(String args[]) {
customException com1 = new customException();
customException com2 = new customException();
customException com3 = new customException();
com1.setName("地铁");
com2.setName("飞机");
com3.setName("轮行");
com1.start();
com2.start();
com3.start();
}
}
这里 我们customException类中 继承了线程Thread类 并编写了run方法 是一个循环语句
然后测试类 通过customException继承的Thread类 给三个线程定义名称 然后开启了三个线程
我们运行代码如下
他们之前并没有优先级 所以 先后顺序和CPU分配都是完全随机的
但其实 显然是 飞机最快 地铁勉强 轮行在大多路程中 会慢一些 那么 他们的CPU分配 应该是 飞机>地铁>轮行
然后我们注释掉线程启动的代码 然后用getPriority输出一下线程的优先级
运行结果如下
由此可见 java线程默认优先级是 5
然后编写customException类代码如下
public class customException extends Thread {
public String name;
public customException(){
}
public void run(){
for(int i = 0;i < 100;i++){
System.out.println(getName()+"第"+(i + 1)+"次输出");
}
}
}
我们将循环增加了十倍 因为执行的久 才能体现出优先级的效果
然后编写测试类main方法如下
public class text {
public static void main(String args[]) {
customException com1 = new customException();
customException com2 = new customException();
customException com3 = new customException();
com1.setName("地铁");
com2.setName("飞机");
com3.setName("轮渡");
com1.setPriority(5);
com2.setPriority(10);
com3.setPriority(1);
com1.start();
com2.start();
com3.start();
}
}
此时 我们通过 setPriority 设置 com1 : 地铁 优先级 5 com2 : 飞机 优先级 10 com3 : 轮渡 1
我们运行代码
我们可以看到 优先级最低的轮渡 确实是最后跑完的 不过还是要强调 优先级高只代表获得CPU 的几率大 不代表是完全按优先级执行的
还有就是 setPriority 有最大最小限制 不许是 1-10之间 否则就会抛出异常