Logo

郎哥编程

线程的优先级

2019-12-31 178

当程序分为多个线程运行时,每个线程都会得到一小段CPU时间来运行,运行时间结束后,将轮换另一个线程进入运行状态,JVM会优先选择优先级高的线程进入运行状态。但这并不意味着优先级底的线程得不到运行,JVM会自动对一段时间内没有得到时间片运行的线程提高优先级。

线程的优先级是由1到10之间的数字来表示的,数字1表示最低优先级,数字10表示最高优先级,默认优先级是5。

Thread类的setPriority()方法可以设置线程的优先级,方法说明如下:

●   void setPriority (int newPriority)

该方法用于更改当前线程的优先级,优先级高的线程会优先运行,同样优先级的线程排在前面的会优先运行。newPriority为设置的优先级数字,如果该数字不在1到10范围之内,会抛出IllegalArgumentException异常(参数异常)。

案例1:建立ThreadPriority线程类,在ThreadPriorityTest测试类中实例化三个ThreadPriority线程对象,并分别设置不同的优先级,在控制台查看三个线程的运行顺序。

在thread包下新建ThreadPriority类。代码如下:

package thread;
 
/** 
* @ClassName: ThreadPriority 
* @Description: 多线程操作(线程的优先级)案例1 
* @author 编程训练营 
* @date 
* 
*/
 
public class ThreadPriority extends Thread {
    // 线程名称
    String  name;
   
    public ThreadPriority(String name)
    {
super(name);    
this.name = name;
    }
 
    /**
    * <p>Title: run</p> 
    * <p>Description: </p>   
    * @see java.lang.Thread#run() 
    */ 
   
    @Override
    public void run() {
       // TODO Auto-generated method stub
       super.run();
       // 在线程中执行的代码
       for( int i = 0; i<10; i++ ) {
           System.out.printf("%s:%d\n",name,i);
       }
 
    }
   
   
 
}

ThreadPriority类定义了name变量,用于存储线程名称,在run()方法代码中输出线程名称。

在thread包下新建ThreadPriorityTest类。代码如下:

package thread;
 
/** 
* @ClassName: ThreadPriorityTest 
* @Description: 多线程操作(线程的优先级)案例1
* @author 编程训练营 
* @date 
* 
*/
 
public class ThreadPriorityTest {
 
    /** 
    * @Title: main 
    * @Description: Java程序入口main方法
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
      
       // 实例化三个ThreadPriority线程对象
       ThreadPriority  threadA = new ThreadPriority("线程A");
       ThreadPriority  threadB = new ThreadPriority("线程B");
       ThreadPriority  threadC = new ThreadPriority("线程C");
       // 设置不同优先级
       threadA.setPriority(1);
       threadC.setPriority(10);
       // 启动线程
       threadA.start();
       threadB.start();
       threadC.start();
    }
 
}

ThreadPriorityTest实例化threadA、threadB、threadC三个线程对象,threadA设置优先级为数字1,threadC设置优先级为数字10,并顺序启动threadA、threadB、threadC线程。

程序执行结果如下图所示:

image.png                                             

从程序执行结果可以看出,虽然线程的启动顺序是threadA、threadB、threadC,实际运行顺序是threadB、threadC、threadA。threadA的优先级最低,虽然threadA最先调用run()方法,但JVM却在最后调度threadA进入运行状态。threadB是默认优先级,由于threadB在threadC之前调用run()方法,虽然threadC的优先级高于threadB,但JVM还是调度threadB进入运行状态。threadB执行完成后,JVM调度threadC进入运行状态。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论