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"(非守护线程). 用户线 ...
随机推荐
- win10系统查看激活状态及是否永久激活
查看windows系统是否激活 找到“此电脑”,右击“属性” 查看windows系统是否永久激活 第一种方法 win+r 进入运行,输入slmgr.vbs -xpr 如图,再点击确定. 弹出一个对话 ...
- php对象转换为数组的部分代码
function object_array($array){ if(is_object($array)){ $array = (array)$array; } if(is_array($array)) ...
- Nginx用法详解
nginx作为一个高性能的web服务器,想必大家垂涎已久,蠢蠢欲动,想学习一番了吧,语法不多说,网上一大堆.下面博主就nginx的非常常用的几个功能做一些讲述和分析,学会了这几个功能,平常的开发和部署 ...
- 关于Mybatis的几件小事(二)
一.MyBatis缓存机制 1.简介 Mybatis包含了一个非常强大的查询缓存的特性,它可以非常方便地配置和定制. 缓存key极大提高查询效率 MyBatis系统中默认定义了两次缓存 默认情况下,只 ...
- docker 第六篇 dockerfile
复习下镜像生成途径 Dockerfile 基于容器制作 什么是dockerfile: 用来构建镜像的源码,在配置文件中调用命令,这些命令是用来生成docker镜像的. dockerfile的语法格式: ...
- LLVM使用其他Pass的结果
之前的工作一直集中在clang中,最近有点空闲时间,又重新熟悉了一下Pass的书写过程.(参考LLVM CookBook和http://llvm.org/docs/WritingAnLLVMPass. ...
- python 获取导入模块的文件路径
接触到项目上有人写好的模块进行了导入,想查看模块的具体内容是如何实现的,需要找到模块的源文件. 本博文介绍两种查找模块文件路径方法: 方法一: #!/usr/bin/python # -*- codi ...
- 使用FindCmdLineSwitch处理命令行参数
一.四个形式(变体) .function FindCmdLineSwitch(const Switch: string; const Chars: TSysCharSet; IgnoreCase: B ...
- 运行tomcat7w.exe提示指定的服务未安装 解决办法
一.问题重现点击bin下tomcat7w.exe出现如下提示:提示指定的服务未安装 二.原因分析tomcat7.exe和tomcat7w.exe要起作用必须先为这两个文件安装服务.其中tomcat7. ...
- 【Struts2】防止表单重复提交
一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) ...