【java 多线程】java线程调度之优先级

一、线程调度之优先级

1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。

Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
static int MAX_PRIORITY
线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY
线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY
分配给线程的默认优先级,取值为5。

Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。

每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。
JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。

注意:

数字越大的优先级越高。但是,优先级高只是意味着该线程获取的 CPU 时间片相对多一些。并不是说是先让你走完。

下面来看一个简单的例子:

package day002;

/**
*
* 项目名称:JavaThread
* 类名称:TestPriority
* 类描述:
* 创建人:liuc
* 创建时间:2018年3月16日 下午4:04:08
* 修改人:liuc
* 修改时间:2018年3月16日 下午4:04:08
* 修改备注:
* @version
*
*/
public class TestPriority extends Thread{
    private String str;

    /**
     * @Title:  TestThread   
     * @Description:    TODO(这里用一句话描述这个方法的作用)   
     * @param:  @param string  
     * @throws   
    */
    public TestPriority(String str) {
        this.str = str;
    }

    /**
    * (non-Javadoc)
    * @see java.lang.Thread#run()
    */
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(str+"线程:"+i);
        }

    }

    public static void main(String[] args) {
        TestPriority t1 = new TestPriority("A");
        TestPriority t2 = new TestPriority("B");
        //设置线程优先级  
        //数字越大的优先级越高。但是,优先级高只是意味着该线程获取的 CPU 时间片相对多一些。
        //并不是说是先让你走完。
        //可以用Thread的常量MAX_PRIORITY(10)、NORM_PRIORITY(5)、
        //MIN_PRIORITY(1)来设置优先级;
        //或者用t1.setPriority(6)这种方式设置优先级
        t1.setPriority(MAX_PRIORITY);
        t2.setPriority(MIN_PRIORITY);
//      t1.setPriority(6);
//      t2.setPriority(2);
        t1.start();
        t2.start();
    }
}

运行结果:

A线程:0
A线程:1
A线程:2
A线程:3
A线程:4
A线程:5
A线程:6
B线程:0
A线程:7
B线程:1
A线程:8
B线程:2
A线程:9
A线程:10
A线程:11
A线程:12
A线程:13
A线程:14
A线程:15
A线程:16
A线程:17
A线程:18
A线程:19
B线程:3
B线程:4
B线程:5
B线程:6
B线程:7
B线程:8
B线程:9
B线程:10
B线程:11
B线程:12
B线程:13
B线程:14
B线程:15
B线程:16
B线程:17
B线程:18
B线程:19

结果说明:
(01) 主线程main的优先级是5。
(02) t1的优先级被设为10,而t2的优先级被设为1。cpu在执行t1和t2的时候,根据时间片轮循调度,所以能够并发执行。

注意:
当线程的优先级设置超出了线程优先级的范围,如下面的例子:

package day002;


/**
*
* 项目名称:JavaThread
* 类名称:TestPriority
* 类描述:
* 创建人:liuc
* 创建时间:2018年3月16日 下午4:04:08
* 修改人:liuc
* 修改时间:2018年3月16日 下午4:04:08
* 修改备注:
* @version
*
*/
public class TestPriority extends Thread{
    private String str;

    /**
     * @Title:  TestThread   
     * @Description:    TODO(这里用一句话描述这个方法的作用)   
     * @param:  @param string  
     * @throws   
    */

    public TestPriority(String str) {
        this.str = str;
    }

    /**
    * (non-Javadoc)
    * @see java.lang.Thread#run()
    */

    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(str+"线程:"+i);
        }

    }

    public static void main(String[] args) {
        TestPriority t1 = new TestPriority("A");
        TestPriority t2 = new TestPriority("B");
        //设置线程优先级  
        //数字越大的优先级越高。但是,优先级高只是意味着该线程获取的 CPU 时间片相对多一些。
        //并不是说是先让你走完。
        //可以用Thread的常量MAX_PRIORITY(10)、NORM_PRIORITY(5)、
        //MIN_PRIORITY(1)来设置优先级;
        //或者用t1.setPriority(6)这种方式设置优先级
        t1.setPriority(11);
        t2.setPriority(MIN_PRIORITY);
//      t1.setPriority(6);
//      t2.setPriority(2);
        t1.start();
        t2.start();
    }
}

会报下面的错误:

Exception in thread "main" java.lang.IllegalArgumentException
    at java.lang.Thread.setPriority(Thread.java:1089)
    at day002.TestPriority.main(TestPriority.java:63)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值