Java是如何对线程进行调度的?
Java虚拟机采用抢占式调度模型:
优先让可运行池中处于就绪态的线程中优先级高的占用CPU,如果可运行池中线程的优先级相同,那么就随机选择一个线程,使其占用CPU,处于运行状态的线程会一直执行,直至它不得不放弃CPU,一个线程会因为以下原因放弃CPU:
(1)Java虚拟机让当前线程暂时放弃CPU,转到就绪态,使其他线程获得运行机会
(2)当前线程因为某些原因而处于阻塞状态
(3)线程运行结束
注意
线程的调度不是跨平台的,它不仅取决于Java虚拟机,还依赖于操作系统。在某些操作系统中,即使运行中的线程没有遇到阻塞,也会在运行一段时间后放弃CPU,给其他线程运行的机会。
java线程的调度不是分时的,同时启动多个线程后,不能保证各个线程轮流获得均等的时间片
抢占式调度模型
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
设置和获取线程的优先级
public final int getPriority()
public final void setPriority(int newPriority)
主线程的优先级:5
线程的优先级是1-10
默认线程都是5
java.lang.IllegalArgumentException
异常名称: 非法参数异常
产生原因: 参数不合法
解决办法: 如果是线程说明线程的优先级不在指定范围内
public class ThreadDemo {
public static void main(String[] args) {
System.out.println("主线程的优先级:" + Thread.currentThread().getPriority());
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr, "zslA");
Thread t2 = new Thread(mr, "zslB");
Thread t3 = new Thread(mr, "zslC");
t1.setPriority(Thread.MIN_PRIORITY); // 1
t2.setPriority(Thread.NORM_PRIORITY);// 5
t3.setPriority(Thread.MAX_PRIORITY); // 10
System.out.println(t1.getPriority());
System.out.println(t2.getPriority());
System.out.println(t3.getPriority());
t1.start();
t2.start();
t3.start();
}
}
/**
* Thread.currentThread().getName() 获取当前线程名称
* Thread.currentThread().setName() 设置当前线程名称
*/
class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}