线程优先级、线程分类(用户线程、守护线程)

本文详细介绍了Java中线程的优先级,指出优先级高的线程并不保证总是先于低优先级线程执行,并通过示例展示了线程优先级设置的效果。同时,解释了用户线程和守护线程的概念,强调守护线程在所有用户线程结束后,JVM会自动退出。最后提供了一个守护线程的示例代码,展示了如何创建和设置守护线程。
摘要由CSDN通过智能技术生成

线程优先级

java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。

贴一段setPriority(int newPriority)源码:

 public final static int MIN_PRIORITY = 1; 
 
 public final static int NORM_PRIORITY = 5;

 public final static int MAX_PRIORITY = 10;
 
 public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
            throw new IllegalArgumentException();
        }
        if((g = getThreadGroup()) != null) {
            if (newPriority > g.getMaxPriority()) {
                newPriority = g.getMaxPriority();
            }
            setPriority0(priority = newPriority);
        }
    }

源码看出,线程优先级范围是0~10,默认是5

获得 线程的优先级:

public final int getPriority() {
        return priority;
    }

线程优先级demo:

public class TestMyThread {
	public static void main(String[] args) {
		MyThread mt1 = new MyThread();
		MyThread mt2 = new MyThread();
		MyThread mt = new MyThread();
		mt1.setPriority(1);// 设置线程的优先级为1
		mt2.setPriority(10); // 设置线程的优先级10
		mt.start(); // 默认情况下线程的优先级为5
		mt1.start();
		mt2.start();

	}

}

class MyThread extends Thread {
	@Override
	public void run() {
		long begin = System.currentTimeMillis();
		for (int i = 0; i < 50000000; i++) {
			int a=2000*20;
		}
		long end = System.currentTimeMillis();
		long time = end - begin;
		System.out.println(Thread.currentThread().getName() + "优先级为:" + this.getPriority() + " 执行完毕,花费时间为" + time); // getPriority()方法可以获取线程的优先级
	}
}

运行5次的结果:

Thread-1优先级为:10 执行完毕,花费时间为3
Thread-2优先级为:5 执行完毕,花费时间为28
Thread-0优先级为:1 执行完毕,花费时间为29

Thread-1优先级为:10 执行完毕,花费时间为2
Thread-0优先级为:1 执行完毕,花费时间为31
Thread-2优先级为:5 执行完毕,花费时间为32

Thread-1优先级为:10 执行完毕,花费时间为3
Thread-2优先级为:5 执行完毕,花费时间为24
Thread-0优先级为:1 执行完毕,花费时间为24

Thread-2优先级为:5 执行完毕,花费时间为3
Thread-0优先级为:1 执行完毕,花费时间为22
Thread-1优先级为:10 执行完毕,花费时间为22

Thread-2优先级为:5 执行完毕,花费时间为3
Thread-1优先级为:10 执行完毕,花费时间为25
Thread-0优先级为:1 执行完毕,花费时间为25

 结果可以看出:并不是优先级高的线程先于优先级低的线程执行完毕,而是线程的优先级只能确保CPU尽量将执行的资源让给优先级高的线程用,但不保证定义的高优先级的线程的大部分都能先于低优先级的线程执行完,所以不建议设置线程的优先级。

线程分类

线程分类:

    用户线程和守护线程

用户线程和守护线程的区别


二者其实基本上是一样的。唯一的区别在于JVM何时离开

用户线程:当存在任何一个用户线程未离开,JVM是不会离开的。

守护线程:如果只剩下守护线程未离开,JVM是可以离开的。

在Java中,制作守护线程非常简单,直接利用.setDaemon(true)

用户线程

定义:平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程

守护线程

定义:是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程。所以java里线程分2种,
1、守护线程,比如垃圾回收线程,就是最典型的守护线程。
2、用户线程,就是应用程序里的自定义线程

 

守护线程demo:

class MyThread extends Thread{  
      public MyThread(String name) {
          super(name);
      }
  
      public void run(){
          try {
              for (int i=0; i<5; i++) {
                 Thread.sleep(3);
                 System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
             }
         } catch (InterruptedException e) {
         }
     } 
 }; 
 
 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) {
         }
     } 
 }
 public class Demo {  
     public static void main(String[] args) {  
 
         System.out.println(Thread.currentThread().getName()
                 +"(isDaemon="+Thread.currentThread().isDaemon()+ ")");
 
         Thread t1=new MyThread("t1");    // 新建t1
         Thread t2=new MyDaemon("t2");    // 新建t2
         t2.setDaemon(true);                // 设置t2为守护线程
         t1.start();                        // 启动t1
         t2.start();                        // 启动t2
     }  
 }

运行结果:

main(isDaemon=false)
t2(isDaemon=true), loop 0
t2(isDaemon=true), loop 1
t1(isDaemon=false), loop 0
t2(isDaemon=true), loop 2
t2(isDaemon=true), loop 3
t1(isDaemon=false), loop 1
t2(isDaemon=true), loop 4
t2(isDaemon=true), loop 5
t2(isDaemon=true), loop 6
t1(isDaemon=false), loop 2
t2(isDaemon=true), loop 7
t2(isDaemon=true), loop 8
t2(isDaemon=true), loop 9
t1(isDaemon=false), loop 3
t2(isDaemon=true), loop 10
t2(isDaemon=true), loop 11
t1(isDaemon=false), loop 4
t2(isDaemon=true), loop 12

结果说明
(01) 主线程main是用户线程,它创建的子线程t1也是用户线程。
(02) t2是守护线程。在“主线程main”和“子线程t1”(它们都是用户线程)执行完毕,只剩t2这个守护线程的时候,JVM自动退出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值