简述

在操作系统中,线程是可以划分优先级的,优先级较高的线程,得到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线程优先级及守护线程(二)的更多相关文章

  1. Java多线程(十)——线程优先级和守护线程

    一.线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon( ...

  2. Java 多线程基础(十一)线程优先级和守护线程

    Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ...

  3. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  4. Java - 线程优先级和守护线程

    Java多线程系列--“基础篇”10之 线程优先级和守护线程 概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注 ...

  5. java 多线程之 线程优先级和守护线程

    线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于"低优先级线程"执行. java 中有两种线程:用户线程和 ...

  6. java 多线程系列基础篇(十)之线程优先级和守护线程

    1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon ...

  7. Java多线程系列 基础篇03 线程的优先级和守护线程

    1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...

  8. java的守护线程与非守护线程

    最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ...

  9. Java中的守护线程和非守护线程(转载)

    <什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...

随机推荐

  1. php操作string的函数

    函数库来源于:http://www.w3school.com.cn/php/php_ref_string.asp 我常用的 echo()------------输出一个或多个字符串. 如:echo ' ...

  2. 《深入理解 Java 虚拟机》学习 -- 类加载机制

    <深入理解 Java 虚拟机>学习 -- 类加载机制 1. 概述 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 J ...

  3. LeetCode:1179.重新格式化部门表

    题目链接:https://leetcode-cn.com/problems/reformat-department-table/ 题目 部门表 Department: +--------------- ...

  4. ThreeJS中创建文字的几种方法

    1. DOM + CSS 传统html5的文字实现,用于添加描述性叠加文字的方法.一般使用绝对定位,并且保证z-index够大,用于显示在3D场景之上. 优点: 与CSS3D效果一致 缺点: 3d效果 ...

  5. 从零开始使用mocha测试

    mocha 需要在node环境下跑,请确保已经安装了node   1.新建一个文件夹 test   2.命令行切换到test目录下,执行命令:npm init ,出现选择按enter,一系列选择完成之 ...

  6. bootstrap 处理警告

    $("#id").bootstrapValidator({}).on('success.field.bv', function (e, data) { })

  7. span元素

    <span>标签属于行内元素(inline),所以无法设置高度和宽度: 如果需要改变其宽高,就需要将其转变为块体元素(block)或行内块体元素(inle-block)

  8. struts 漏洞

    安装shop++ 安装成功 访问 http://127.0.0.1:8080 即网站首页 访问 http://127.0.0.1:8080/admin 即网站后台

  9. Delphi 从一个对象中继承数据和方法

  10. Hive正则表达式

    正则表达式基本语法 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔.但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用. 其中 ?: 是非捕获元之一,还 ...