程序猿学社的GitHub,欢迎Star
https://github.com/ITfqyd/cxyxs
本文已记录到github,形成对应专题。
上一篇文章,我们了解线程安全的那些事,以及如何去解决线程安全的问题,本文就来聊一聊线程的优先级。
1.线程优先级的概念
public static void main(String[] args) {
System.out.println(Thread.currentThread().getPriority());
}
getPriority方法获取线程的优先级
为什么是5? 如果我们没有指定某个线程的优先级,那这个线程的默认的优先级就是5。当然,这句话,也不是绝对的。下面这个demo,就可以推翻这个结论。
public static void main(String[] args) {
System.out.println("主线程优先级:"+Thread.currentThread().getPriority());
//1
Thread.currentThread().setPriority(1);
System.out.println("设置主线程的优先级为1");
Runnable runnable = new Runnable(){
@Override
public void run() {
System.out.println("程序猿学社:从线程优先级为"+Thread.currentThread().getPriority());
}
};
Thread thread = new Thread(runnable);
//2
//thread.setPriority(10);
thread.start();
}
1注释放开,2注释
1注释放开,2注释放开
package com.cxyxs.thread.seven;
/**
* Description:
* 转发请注明来源 程序猿学社 - https://ithub.blog.csdn.net/
* Author: 程序猿学社
* Date: 2020/2/26 12:12
* Modified By:
*/
public class Demo2 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程优先级为"+Thread.currentThread().getPriority());
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程优先级为"+Thread.currentThread().getPriority());
}
};
Thread thread = new Thread(runnable,"隔壁老王");
//thread.setPriority(10);
thread.start();
}
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
Thread thread = new Thread(demo2,"程序猿学社");
thread.setPriority(1);
thread.start();
}
}
如果被使用的线程没有指点优先级,以调用方线程为准。
被使用线程指定优先级,则以自身优先级为准(就近原则)。
线程优先级越高,是否优先执行?
package com.cxyxs.thread.seven;
/**
* Description:验证优先级高的是否优先执行
* 转发请注明来源 程序猿学社 - https://ithub.blog.csdn.net/
* Author: 程序猿学社
* Date: 2020/2/26 12:25
* Modified By:
*/
public class Demo3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+","+i);
}
}
public static void main(String[] args) {
Demo3 demo = new Demo3();
Thread t = new Thread(demo,"程序猿学社");
Thread t1 = new Thread(demo,"后羿");
Thread t2 = new Thread(demo,"鲁班");
t.setPriority(1);
t2.setPriority(10);
t.start();
t1.start();
t2.start();
}
}
看测试的结果,是真的和符合我们之前提的问题,优先级高的线程先执行。