线程调度
1、问题引入
(1)假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是CPU使用权,才可以执行指令。那么Java是如何对线程进行调用的呢?
(2)线程有两种调度模型:
- 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片。
- 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
(3)Java中使用的是抢占式线程调度模型。
(4)演示如何设置和获取线程优先级。
- public final int getPriority():返回线程对象的优先级
- public final void setPriority(int newPriority):更改线程的优先级
2、创建线程类:继承Thread类的方式
package cn.itcast_04;
public class ThreadPriority extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
}
}
}
3、线程类的测试类
package cn.itcast_04;
/*
* 我们的线程没有设置优先级,肯定有默认优先级。
* 那么,默认优先级是多少呢?
* 如何获取线程对象的优先级?
* public final int getPriority():返回线程对象的优先级
* 如何设置线程对象的优先级呢?
* public final void setPriority(int newPriority):更改线程的优先级。
*
* 注意:
* 线程默认优先级是5。
* 线程优先级的范围是:1-10。
* 线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。
*
* IllegalArgumentException:非法参数异常。
* 抛出的异常表明向方法传递了一个不合法或不正确的参数。
*
*/
public class ThreadPriorityDemo {
public static void main(String[] args) {
ThreadPriority tp1 = new ThreadPriority();
ThreadPriority tp2 = new ThreadPriority();
ThreadPriority tp3 = new ThreadPriority();
tp1.setName("东方不败");
tp2.setName("岳不群");
tp3.setName("林平之");
// 获取默认优先级
// System.out.println(tp1.getPriority());
// System.out.println(tp2.getPriority());
// System.out.println(tp3.getPriority());
// 设置线程优先级
// tp1.setPriority(100000);
//设置正确的线程优先级
tp1.setPriority(10);
tp2.setPriority(1);
tp1.start();
tp2.start();
tp3.start();
}
}
测试总结:
(1)线程优先级的获取与设置:
- 如何获取线程对象的优先级? public final int getPriority():返回线程对象的优先级。
- 如何设置线程对象的优先级呢? public final void setPriority(int newPriority):更改线程的优先级。
(2)线程优先级的范围:
- 线程优先级的范围是:1-10
- 线程优先级的最大值:
MAX_PRIORITY 是10
- 线程优先级的最小值:
MIN_PRIORITY 是1
- 线程默认优先级:
NORM_PRIORITY 是5
- 线程优先级高,仅仅表示线程获取到CPU时间片的几率高,但是要在次数比较多或者多次运行的情况下才能看到比较好的效果。
(3)IllegalArgumentException:非法参数异常。
- 抛出的异常表明向方法传递了一个不合法或不正确的参数。
(4)获取当前正在执行的线程对象:
- Thread.currentThread():获取当前正在执行的线程对象
- Thread.currentThread().getName():获取当前正在执行的线程对象的名称