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

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

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会自动退出。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值