一篇博文彻底了解线程的调度策略

来源:互联网 发布:神机配模软件 编辑:程序博客网 时间:2024/05/19 15:42

线程的调度策略

在java的线程开发中,线程的调度策略是一个很重要的知识点,起承上启下的作用,所以我们下面去一起看看系统是怎么安排线程之间的运行规则的。

线程调度的目的

首先我们要知道,java引入线程调度策略的目的所在。那就是对处于可运行状态的多个线程对象进行系统级的协调,防止多个线程争用有限资源而导致系统死机或者崩溃。也正是为了解决这个问题才有了优先级这个东西。

调度策略的具体原理

java 的调度策略是基于线程优先级的抢先式调度。意思就是,谁的优先级高那我就先给谁使用系统资源。比如说,当前正在运行一个优先级为5的线程,这个时候来了一个优先级为8的线程,那么系统就会把当前运行的线程挂起,去运行这个优先级高的线程,一直等到这个优先级高的线程运行完毕才会继续运行它。如果说来的也是一个优先级为5的线程,那么他们两个就是轮流使用系统资源,谁也不用让谁。

线程的控制

当然了,在java中也可以人为的去干预线程的运行规则,比如说希望明确的让一个线程给另一个线程运行的机会,那么可以采取下列4种办法:
1.调整线程各个的优先级
2.让处于运行中的线程调用sleep()睡一会,从而让出系统CPU资源
3.让运行中的线程调用yield()方法,实现主动把CPU资源交给下一个可运行的线程
4.让处于运行的线程调用另一个线程的join()方法,等待另一个线程的结束


线程的优先级

所有的线程都又一个优先级,然后所有处于可运行状态的线程都是根据自身的优先级排列在可运行队列中的。优先级高的获得较多的运行机会,在java中优先级分为了10个等级,依次用整数1~10表示。在Thread类里面封装了三个静态的常量
MAX_PRORITY 的值是10 ,表示最高级
MIN_PRORITY 的值是1,表示最低级
NORM_PRORITY 的值是5,在java中的线程默认级别
每一个线程的默认优先级都继承自它的父线程,如果要想获得线程的优先级可以使用getPriority()方法,设置线程的优先级使用setPriority().
下面使用一个例子来演示一下优先级:
eg:创建多个线程,并分别为他们设置优先级,然后看他们的运行结果
class MyThread extends Thread{private String message;public  MyThread(String msg){message = msg;}public void run(){for(int i = 0;i < 3;i++){System.out.println(message + " " + getPriority());}}}public class ThreadPriorityDemo{public static void main(String[] args){Thread t1 = new MyThread("T1");t1.setPriority(1);t1.start();Thread t2 = new MyThread("T2");t2.setPriority(5);t2.start();Thread t3 = new MyThread("T3");t3.setPriority(10);t3.start();}}

此程序打印结果为:
T2 5
T3 10
T1 1
T3 10
T2 5
T3 10
T1 1
T2 5
T1 1
看看结果,你是不是明白了什么?优先级高的会获得更多的运行机会。
好了,这篇就到这里吧!
0 0
原创粉丝点击