首页 > 编程 > Java > 正文

Java多线程系列(8)--线程优先级和守护线程(后台线程)

2019-11-08 00:58:10
字体:
来源:转载
供稿:网友

一、线程优先级的基本概述

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),loop0t2(10),loop1t2(10),loop2t1(1),loop0t2(10),loop3t1(1),loop1t2(10),loop4t1(1),loop2t1(1),loop3t1(1),loop4main(5)t2(10),loop0t2(10),loop1t2(10),loop2t2(10),loop3t2(10),loop4t1(1),loop0t1(1),loop1t1(1),loop2t1(1),loop3t1(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 0t2(isDaemon=true), loop 1t2(isDaemon=true), loop 2t1(isDaemon=false),loop0t2(isDaemon=true), loop 3t2(isDaemon=true), loop 4t1(isDaemon=false),loop1t2(isDaemon=true), loop 5t2(isDaemon=true), loop 6t2(isDaemon=true), loop 7t2(isDaemon=true), loop 8t1(isDaemon=false),loop2t2(isDaemon=true), loop 9t2(isDaemon=true), loop 10t2(isDaemon=true), loop 11t1(isDaemon=false),loop3t2(isDaemon=true), loop 12t2(isDaemon=true), loop 13t1(isDaemon=false),loop4t2(isDaemon=true), loop 14

将线程t2设置为守护线程,而主线程和线程t1为用户线程,当用户线程执行完毕后,只有线程t2这个守护线程时,JVM会自动退出。

文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表