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

一、线程优先级

Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程。线程调度器通过线程的优先级来决定调度哪些线程执行。一般来说,Java的线程调度器采用时间片轮转算法使多个线程轮转获得CPU的时间片。然而根据实际情况,每个线程的重要程序也不相同,有时候我们想让一些线程优先执行,那么我们可以将他的优先级调高一下,这样它们获得的时间片会多一些。

多个线程处于就绪状态时,若这些线程的优先级相同,则线程调度器会按时间片轮转方式或独占方式来分配线程的执行时间。

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

Java中线程优先级分为三个级别:

  • 低优先级:1~4,其中类变量 Thread.MIN_PRORITY 最低,数值为1;
  • 默认优先级:如果一个线程没有指定优先级,默认优先级为5,由类变量 Thread.NORM_PRORITY表示;
  • 高优先级:6~10,类变量 Thread.MAX_PRORITY 最高,数值为10。

注意:具有相同优先级的多个线程,若它们都为高优先级Thread.MAX_PRORITY,则每个线程都是独占式的,也就是这些线程将被顺序执行;若它们优先级不是高优先级,则这些线程将被同时执行,可以说是无序执行。

java 中有两种线程:用户线程和守护线程。可以通过 isDaemon() 方法来区别它们:如果返回 false,则说明该线程是“用户线程”;否则就是“守护线程”。
用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出。

JDK中对用户线程与守护线程的解释:

每个线程都有一个优先级。“高优先级线程”会优先于“低优先级线程”执行。每个线程都可以被标记为一个守护进程或非守护进程。在一些运行的主线程中创建新的子线程时,
子线程的优先级被设置为等于“创建它的主线程的优先级”,当且仅当“创建它的主线程是守护线程”时“子线程才会是守护线程”。
当Java虚拟机启动时,通常有一个单一的非守护线程(该线程通过是通过main()方法启动)。JVM会一直运行直到下面的任意一个条件发生,JVM就会终止运行:
①、调用了exit()方法,并且exit()有权限被正常执行。
②、所有的“非守护线程”都死了(即JVM中仅仅只有“守护线程”)。
每一个线程都被标记为“守护线程”或“用户线程”。当只有守护线程运行时,JVM会自动退出。 

二、线程优先级示例

public class Demo01 {
private static Object obj = new Object();
public static void main(String[] args) { Thread t1 = new ThreadA("t1");
Thread t2 = new ThreadA("t2"); t1.setPriority(1); // 设置优先级为1
t2.setPriority(10);// 设置优先级为10 t1.start();
t2.start();
}
}
class ThreadA extends Thread{
public ThreadA(String name) {
super(name);
}
public void run() {
for(int i = 0;i < 3;i++)
System.out.println(Thread.currentThread().getName() + " [ "
+ Thread.currentThread().getPriority() + " ] loop " + i);
}
}
// 运行结果
t1 [ 1 ] loop 0
t2 [ 10 ] loop 0
t2 [ 10 ] loop 1
t2 [ 10 ] loop 2
t1 [ 1 ] loop 1
t1 [ 1 ] loop 2

说明:

①、主线程main的优先级是5。
②、t1的优先级被设为1,而t2的优先级被设为10。cpu在执行t1和t2的时候,根据时间片轮循调度,所以能够并发执行。

三、守护线程示例

public class Demo {
public static void main(String[] args) { System.out.println(Thread.currentThread().getName()
+" [ isDaemon = "+Thread.currentThread().isDaemon()+ " ]");
Thread t1=new ThreadA("t1");
Thread t2=new MyDaemon("t2");
t2.setDaemon(true);// 设置t2为守护线程
t1.start();
t2.start();
}
}
class ThreadA extends Thread{
public ThreadA(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) {
}
}
}
// 运行结果
main [ isDaemon = false ]
t2[ isDaemon = true ] loop 0
t2[ isDaemon = true ] loop 1
t2[ isDaemon = true ] loop 2
t1[ isDaemon = false ] loop 0
t2[ isDaemon = true ] loop 3
t2[ isDaemon = true ] loop 4
t1[ isDaemon = false ] loop 1
t2[ isDaemon = true ] loop 5
t2[ isDaemon = true ] loop 6
t2[ isDaemon = true ] loop 7
t1[ isDaemon = false ] loop 2
t2[ isDaemon = true ] loop 8
t2[ isDaemon = true ] loop 9
t2[ isDaemon = true ] loop 10
t1[ isDaemon = false ] loop 3
t2[ isDaemon = true ] loop 11
t2[ isDaemon = true ] loop 12
t2[ isDaemon = true ] loop 13
t2[ isDaemon = true ] loop 14
t1[ isDaemon = false ] loop 4
t2[ isDaemon = true ] loop 15

说明:

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

Java 多线程基础(十一)线程优先级和守护线程的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. Java 多线程基础(十)interrupt()和线程终止方式

    Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...

  7. Java线程优先级及守护线程(二)

    简述 在操作系统中,线程是可以划分优先级的,优先级较高的线程,得到CPU优先执行的几率就较高一些.设置线程的优先级,有助于帮助线程规划期选择下一个哪一个线程优先执行,但是线程优先级高不代表一定会优先执 ...

  8. java多线程基础API

    本次内容主要讲认识Java中的多线程.线程的启动与中止.yield()和join.线程优先级和守护线程. 1.Java程序天生就是多线程的 一个Java程序从main()方法开始执行,然后按照既定的代 ...

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

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

随机推荐

  1. jupyter notebook 安装扩展nbextensions

    安装nbextensions可提高jupyter notebook效率,安装步骤如下: 1.pip 方式安装: (gluon) [root@localhost ~]# pip install jupy ...

  2. HTML、CSS与JS实现简易iPhone计算器

    效果如图 源码,通俗易懂 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  3. Shell脚本 (二) 变量与运算符

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 四.Shell 中的变量 1.系统变量 1.1 常用系统变量 $HOME. $PWD. $SHELL . ...

  4. Java实现蓝桥杯VIP算法训练 小生物的逃逸

    试题 算法训练 小生物的逃逸 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 空间中有n个球,这些球不相交也不相切.有m个可以视为质点的小生物,可能在某些球内,也可能在所有球之外,但 ...

  5. Java实现 LeetCode 43 字符串相乘

    43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2& ...

  6. java实现第三届蓝桥杯机器人行走

    机器人行走 [编程题](满分18分) 某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). ...

  7. mybatis技术总结

    一.框架概述 day1 1.什么是框架 框架是系统的可重用设计,是对J2EE底层技术的封装(JDBC,IO流,多线程,Servlet,Socket). 2.框架解决了哪些问题? 1.解决了技术整合问题 ...

  8. 通知!Symantec品牌证书已正式更名为Digicert

    尊敬的合作伙伴和客户: 您好! 2017年8月2日,CA认证机构Digicert宣布正式收购 Symantec 安全认证业务.为此,Digicert宣布从2020年4月30日起,停止使用与赛门铁克(S ...

  9. Spire.Cloud.SDK for Java 合并、拆分Excel单元格

    Spire.Cloud.SDK for Java 是Spire.Cloud云产品系列中,用于处理Word.Excel.PowerPoint以及PDF文档的JAR文件,可执行文档编辑.转换.保存等操作. ...

  10. TCP最简单的服务程序

    #include <time.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#in ...