Java线程优先级及守护线程(二)
简述
在操作系统中,线程是可以划分优先级的,优先级较高的线程,得到CPU优先执行的几率就较高一些。设置线程的优先级,有助于帮助线程规划期选择下一个哪一个线程优先执行,但是线程优先级高不代表一定会优先执行,这在下文会说明原因
如何设置线程优先级
设置线程优先级的方法是 setPriority,jdk中该方法的代码如下:
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);
        }
    }在java中,线程的优先级分为1~10,这10个等级,如果优先级的值小于1或大于10,则jdk就会抛出异常 throw new IllegalArgumentException()。在jdk中使用3个常量来预定义优先级的值:
 /**
     * 线程最小优先级
     */
    public final static int MIN_PRIORITY = 1;
   /**
     * 线程默认优先级
     */
    public final static int NORM_PRIORITY = 5;
    /**
     * 线程最大优先级
     */
    public final static int MAX_PRIORITY = 10;线程优先级具有3中特性,分别是:继承性、规则性、随机性,下面将一一说明:
1、继承性
在Java中,线程的优先级具有继承性,比如线程A启动线程,则线程B的优先级与线程A是一样的
public class ThreadA extends Thread {
    @Override
    public void run() {
        System.out.println(" ThreadA run priority=" + this.getPriority());
        ThreadB thread2 = new ThreadB();
        thread2.start();
    }
}
public class ThreadB extends Thread {
    @Override
    public void run() {
        System.out.println(" ThreadB run priority=" + this.getPriority());
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        Thread.currentThread().setPriority(6);
        System.out.println(" main thread priority=" + Thread.currentThread().getPriority());
        ThreadA threadA = new ThreadA();
        threadA.start();
    }
}
输出结果:
 main thread priority=6
 ThreadA run priority=6
 ThreadB run priority=6从结果可以看出,ThreadA继承了main的优先级,ThreadB继承了ThreadA的优先级
2、规则性
public class ThreadA extends Thread {
    @Override
    public void run() {
        long beginTime = System.currentTimeMillis();
        long aCount = 0;
        for (int i = 0; i < 50000; i++) {
            Random random = new Random();
            aCount += random.nextInt() + i;
        }
        long endTime = System.currentTimeMillis();
        System.out.println(" ★ ★ ★ ★ ★ thread A use time=" + (endTime - beginTime));
    }
}
public class ThreadB extends Thread {
    @Override
    public void run() {
        long beginTime = System.currentTimeMillis();
        long bCount = 0;
        for (int i = 0; i < 50000; i++) {
            Random random=new Random();
            bCount+=random.nextInt()+i;
        }
        long endTime = System.currentTimeMillis();
        System.out.println(" ☆ ☆ ☆ ☆ ☆ thread B use time=" + (endTime - beginTime));
    }
}
public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            ThreadA threadA = new ThreadA();
            threadA.setPriority(10);
            threadA.start();
            ThreadB threadB = new ThreadB();
            threadB.setPriority(6);
            threadB.start();
        }
    }输出结果:
★ ★ ★ ★ ★ thread A use time=23
 ☆ ☆ ☆ ☆ ☆ thread B use time=29
 ★ ★ ★ ★ ★ thread A use time=29
 ☆ ☆ ☆ ☆ ☆ thread B use time=34
 ★ ★ ★ ★ ★ thread A use time=34
 ★ ★ ★ ★ ★ thread A use time=36
 ☆ ☆ ☆ ☆ ☆ thread B use time=38
 ☆ ☆ ☆ ☆ ☆ thread B use time=37
 ★ ★ ★ ★ ★ thread A use time=7
 ☆ ☆ ☆ ☆ ☆ thread B use time=4运行多次之后,我们发现高优先级的线程总是大部分先执 完,但不代表高优先级的 线程全部先执行完。说明线程的优先级具有一定的规则性,也就是CPU尽量将执行资源 让给优先级比较高的线程。
3、随机性
前面的事例证明了线程的优先级较高则优先执行完 run()方法中的任务, 但这个结果不是肯定的, 因为线程的优先级还具有随机性,也就是线程优先级高的线程并不一定每次都先执行完 
。将上述事例两个线程的优先级分别调整为相近的优先级,运行多次后就会发现这种随机性。
什么是守护线程
在Java线程中有两种类型的线程,一种是用户线程,另一种是守护线程。
守护线程是一种特殊的线程,典型的守护线程就是垃圾回收线程,当进程中没有用户线程了,则垃圾回收线程也就没有存在的必要了,会自动销毁。
public class MyThread extends Thread {
    private int i = 0;
    @Override
    public void run() {
        try {
            while (true) {
                i++;
                System.out.println(" i=" + (i));
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        try {
            MyThread thread = new MyThread();
            thread.setDaemon(true);
            thread.start();
            Thread.sleep(5000);
            System.out.println("主线程执行完毕了,守护线程也要停止了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}输出结果:
 i=1
 i=2
 i=3
 i=4
 i=5
主线程执行完毕了,守护线程也要停止了Java线程优先级及守护线程(二)的更多相关文章
- Java多线程(十)——线程优先级和守护线程
		一.线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon( ... 
- Java 多线程基础(十一)线程优先级和守护线程
		Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ... 
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
		概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ... 
- Java - 线程优先级和守护线程
		Java多线程系列--“基础篇”10之 线程优先级和守护线程 概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注 ... 
- java 多线程之 线程优先级和守护线程
		线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于"低优先级线程"执行. java 中有两种线程:用户线程和 ... 
- java 多线程系列基础篇(十)之线程优先级和守护线程
		1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon ... 
- Java多线程系列  基础篇03 线程的优先级和守护线程
		1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ... 
- java的守护线程与非守护线程
		最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ... 
- Java中的守护线程和非守护线程(转载)
		<什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ... 
随机推荐
- springcloud eureka注册中心分布式配置
			最近在学习springcloud,做下笔记以及记下遇到的坑. 1.建立maven工程,结构很简单,一个启动类和一个配置文件,结构如下图所示 2.启动类代码如下,需要添加注册中心注解:EnableEur ... 
- fastclick插件学习(一)之用法
			原理 在检测到touchend事件后, 会通过dom自定义事件模拟一个click事件,并把浏览器300ms之后真正触发的点击事件屏蔽掉,fastclick是不会对PC浏览器添加监听事件 使用 1.引入 ... 
- Hash一致性算法底层原理
			大纲 Hash取余算法 判定哈希算法好坏的四个定义 一致性Hash算法的两大设计 Hash取余算法 hash(Object.key)%N,hash值随Object.key.N的变化而变化. 如果有节点 ... 
- EF Core的级联删除
			级联删除由DeleteBehavior的枚举值来设置: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项/子项的影响 Cascade 删除实体 删除实体 ClientSetNull 外键属性 ... 
- vue模板字符串写法
			1.模板字符串拼接id <div class="thumbnail" :id="`ctrol_${item.id}`"> <i :class= ... 
- select  input 等控件进行清空操作
			<html> <head> <meta charset="utf-8" /> <title></title> <s ... 
- 服务框架 Pigeon 的设计与实现
			1.服务框架Pigeon架构 监控系统 - CAT,负责调用链路分析.异常监控告警 配置中心 - Lion,负责一些开关配置读取 服务治理 - Governor 一个interface定义为一个服务, ... 
- java之JVM学习--简单了解GC算法
			JVM内存组成结构: (1)堆 所有通过new创建的对象都是在堆中分配内存,其大小可以通过-Xmx和-Xms来控制,堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区.Sur ... 
- Spring事务的配置、参数详情及其原理介绍(Transactional)
			Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP,将具体业务逻辑与事务处理解耦.声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中 ... 
- 11.SpringMVC注解式开发-处理器方法的返回值
			处理器方法的返回值 使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型 1.ModelAndView 2.String 3.void 4.自定义类型对象 1.返回Model ... 
