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"(非守护线程). 用户线 ...
随机推荐
- 怎样理解undefined和 null
前言: undefined表示 "未定义", null 表示 "空" 第一步: 一般在变量或属性没有声明或者声明以后没有赋值时, 这个变量的值就是undefin ...
- 关于工作单元模式——工作单元模式与EF结合的使用
工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个Db ...
- JavaScript Basics_Fundamentals Part 2_A simple calendar
下方的日历框架是从 Active learning: A simple calendar 上整过来的. 主要任务是用 if...else 语句来让日历本显示出每月相对应的天数,相关代码已经给出,我们只 ...
- docker第一篇 容器技术入门
Container 容器是一种基础工具,泛指任何可以容纳其它物品的工具. Linux Namespaces (docker容器技术主要是通过6个隔离技术来实现) namespace 系统调用参数 ...
- vue cli创建脚手架
1.用vscode打开一个文件夹.在菜单栏 点击 查看-集成终端.这里可以用其他的方法比如cmd命令符调开这个界面,但是要用cd 切到要放文件的文件夹下. 2.安装好node.js 和淘宝镜像 3. ...
- react 预览pdf 转换
function getReader(response){ return new Promise(function(resolve,reject){ response.blob().then( blo ...
- python 只导出项目依赖包
平时导出依赖一般都是 pip freeze > requirements.txt 这种方式导出的是当前python环境中所有的包,只会多不会少,有些库不是必需的也跟着导出来,冗余过重. 这 ...
- (备忘)Eclipse设置:背景与字体大小和xml文件中字体大小调整
Eclipse中代码编辑背景颜色修改: 1.打开window / Preference,弹出Preference面板 2.展开General标签,选中Editors选项,展开. 3.选中 Text ...
- touchgfx MVP
- 深入理解Java虚拟机——读书笔记
首先 强烈推荐周志明老师的这本书,真的可以说是(起码中文出版界)新手了解Java虚拟机必须人手一本的教科书!!! 第二部分自动内存管理机制 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器 ...