一、线程优先级的基本概述
Java中的线程优先级的范围是1~10.默认的优先级是5。”高优先级线程”会优先于“低优先级线程”执行。
线程的优先级将该线程的重要性传递给了调度器。尽管CPU处理现有线程集的顺序是不确定的,但是调度器倾向于让优先权最高的线程先执行。然而,这并不是意味着优先权较低的线程得不到执行(即优先权并不会导致死锁),优先级低的线程仅仅是执行的频率较低。
Java中有两种线程:用户线程和守护线程。
可以通过isDaemon()方法来区别它们:如果返回false。则说明该线程是“用户线程;否则就是“守护线程”。
用户线程一般用于执行用户级任务,而守护线程,即后台线程,一般用来执行后台任务。并且这种线程并不属于程序中不可或缺的部分,当所有非后台线程(用户线程)结束时,程序也就终止了,同时会杀死进程中的所有的后台线程;也就是说,只要有非后台线程还在运行,程序就不会终止。
二、线程优先级代码实例
package Test;
/**
* Created by LKL on 2017/2/21.
*/
public class TestPriority {
public static void main(String[] args){
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")");
Thread t1=new ThreadPriority("t1"); // 新建t1
Thread t2=new ThreadPriority("t2"); // 新建t2
t1.setPriority(1); // 设置t1的优先级为1
t2.setPriority(10); // 设置t2的优先级为10
t1.start(); // 启动t1
t2.start(); // 启动t2
}
}
package Test;
/**
* Created by LKL on 2017/2/21.
*/
public class ThreadPriority extends Thread {
public ThreadPriority(String name){
super(name);
}
public void run(){
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"("+Thread.currentThread().getPriority()+"),loop" + i);
}
}
}
其中两次运行结果如下:
main(5)
t2(10),loop0
t2(10),loop1
t2(10),loop2
t1(1),loop0
t2(10),loop3
t1(1),loop1
t2(10),loop4
t1(1),loop2
t1(1),loop3
t1(1),loop4
main(5)
t2(10),loop0
t2(10),loop1
t2(10),loop2
t2(10),loop3
t2(10),loop4
t1(1),loop0
t1(1),loop1
t1(1),loop2
t1(1),loop3
t1(1),loop4
通过对比可以得到,高优先级只是体现出执行的频率会更高,也不是一直占用。
三、守护线程的代码实例
package Test;
/**
* Created by LKL on 2017/2/21.
*/
public class TestDaemon {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()
+"(isDaemon="+Thread.currentThread().isDaemon()+ ")");
Thread t1=new MyThread4("t1"); // 新建t1
Thread t2=new MyDaemon("t2"); // 新建t2
t2.setDaemon(true); // 设置t2为守护线程
t1.start(); // 启动t1
t2.start(); // 启动t2
}
}
package Test;
/**
* Created by PVer on 2017/2/21.
*/
public class MyDaemon extends Thread{
public MyDaemon(String name) {
super(name);
}
public void run(){
try {
for (int i=0; i<10000; i++) {
Thread.sleep(1);
System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
}
} catch (InterruptedException e) {
}
}
}
package Test;
/**
* Created by LKL on 2017/2/21.
*/
public class MyThread4 extends Thread {
public MyThread4(String name) {
super(name);
}
@Override
public void run() {
for (int i=0;i<5;i++){
try {
Thread.sleep(3);
System.out.println(this.getName()+"(isDaemon="+this.isDaemon()+")"+",loop" +i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果如下:
main(isDaemon=false)
t2(isDaemon=true), loop 0
t2(isDaemon=true), loop 1
t2(isDaemon=true), loop 2
t1(isDaemon=false),loop0
t2(isDaemon=true), loop 3
t2(isDaemon=true), loop 4
t1(isDaemon=false),loop1
t2(isDaemon=true), loop 5
t2(isDaemon=true), loop 6
t2(isDaemon=true), loop 7
t2(isDaemon=true), loop 8
t1(isDaemon=false),loop2
t2(isDaemon=true), loop 9
t2(isDaemon=true), loop 10
t2(isDaemon=true), loop 11
t1(isDaemon=false),loop3
t2(isDaemon=true), loop 12
t2(isDaemon=true), loop 13
t1(isDaemon=false),loop4
t2(isDaemon=true), loop 14
将线程t2设置为守护线程,而主线程和线程t1为用户线程,当用户线程执行完毕后,只有线程t2这个守护线程时,JVM会自动退出。
文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…