线程的优先级、等待线程、守护线程

我们可以通过 public final void setPriority(int newPriority)
来设置线程的优先级,但是优先级并不是绝对的,只是相对来说比其他的线程得到CPU的资源机会多一些。

一个线程的优先级设置遵从以下原则:

线程创建时,子继承父的优先级。
线程创建后,可通过调用setPriority()方法改变优先级。
线程的优先级是1-10之间的正整数,线程优先级最高为10,最低为1,默认为5。

1- MIN_PRIORITY
10-MAX_PRIORITY
5-NORM_PRIORITY


无时间片轮循机制时,高级别的线程优先执行,如果低级别的线程正在运行时,有高级别线程可运行状态,则会执行完低级别线程,再去执行高级别线程。
如果低级别线程处于等待、睡眠、阻塞状态,或者调用yield()函数让当前运行线程回到可运行状态,以允许具有相同优先级或者高级别的其他线程获得运行机会。
因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。结论:yield()从未导致线程转到等待/睡眠/阻塞状态。
在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

代码示例:

package demo4;public class MyThread extends Thread{//给线程定个变量,取个名字private String name;public MyThread(String name){this.name = name;}/* 线程的执行逻辑体 */@Overridepublic void run(){for (int i = 0; i <= 100; i++) {System.out.println(name+"下载了:"+i+"%");}}
}
package demo4;public class ThreadTest {public static void main(String[] args) {//创建一个线程的对象MyThread mt = new MyThread("极品飞车14");//创建一个线程的对象MyThread my = new MyThread("GTA5");//启动线程//创建一个优先级my.setPriority(Thread.MAX_PRIORITY);//最高优先级 最大值10//mt.setPriority(Thread.MIN_PRIORITY);//最低优先级 最小值1//mt.setPriority(Thread.NORM_PRIORITY);//分配给线程默认的优先级 普通值 5mt.start();//开启线程my.start();//开启线程//System.out.println("下载结束");}
}

线程的优先执行

让一个线程优先执行:使用join()
注意:

使用join会报异常
加入线程必须要在先执行的线程的start()下面来执行。

package demo4;public class ThreadTest {public static void main(String[] args) throws InterruptedException {//创建线程的对象MyThread mt = new MyThread("极品飞车14");MyThread my = new MyThread("GTA5");MyThread mx = new MyThread("地平线4");mt.start();//开启线程my.start();//开启线程//加入线程必须要在先执行的线程的start()下面来执行。my.join();mx.start();//开启线程//System.out.println("下载结束");}
}

等待线程(让出线程)

yield():暂停当前正在执行的线程对象,并执行其他线程。

当前的线程从运行阶段回到就绪阶段,目的是吧cpu的资源让给其他的线程。

package demo5;public class MyThread extends Thread{//给线程定个变量,取个名字private String name;public MyThread(String name){this.name = name;}/* 线程的执行逻辑体 */@Overridepublic void run(){for (int i = 0; i <= 100; i++) {System.out.println(name+"下载了:"+i+"%");//让出线程,谁先抢到CPU算谁的Thread.yield();}}
}
package demo5;public class ThreadTest {public static void main(String[] args) throws InterruptedException {//创建线程的对象MyThread mt = new MyThread("极品飞车14");MyThread my = new MyThread("GTA5");MyThread mx = new MyThread("地平线4");mt.start();//开启线程my.start();//开启线程mx.start();//开启线程}
}

守护线程

setDaemon():将该线程标记为守护线程或用户线程
守护线程会随着主线程的结束而结束。
package demo5;public class MyThread extends Thread{//给线程定个变量,取个名字private String name;public MyThread(String name){this.name = name;}/* 线程的执行逻辑体 */@Overridepublic void run(){for (int i = 0; i <= 100; i++) {System.out.println(name+"下载了:"+i+"%");//让出线程,谁先抢到CPU算谁的}}
}
package demo5;public class ThreadTest {public static void main(String[] args) throws InterruptedException {//创建线程的对象MyThread mt = new MyThread("极品飞车14");//设置守护线程mt.setDaemon(true);mt.start();//开启线程System.out.println("主线程结束");}
}package demo5;public class ThreadTest {public static void main(String[] args) throws InterruptedException {//创建线程的对象MyThread mt = new MyThread("极品飞车14");//设置守护线程mt.setDaemon(true);mt.start();//开启线程System.out.println("主线程结束");}
}

线程的优先级、等待线程、守护线程相关推荐

  1. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  2. 线程管理(七)守护线程的创建和运行

    声明:本文是< Java 7 Concurrency Cookbook >的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:方腾飞 守护线程的创建 ...

  3. 第三十三天- 线程创建、join、守护线程、死锁

    1.线程,线程创建 概念:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责 ...

  4. Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行...

    Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...

  5. 守护线程------setDaemon(true)设置成守护线程

    代码: package cn.tedu.thread; public class DeamonDemo { public static void main(String[] args) { //创建线 ...

  6. 守护线程是什么?守护线程和非守护线程的区别是?守护线程的作用是?

    守护线程是区别于用户线程,用户线程即我们手动创建的线程,而守护线程是程序运行的时候在后台提供一种通用服务的线程.垃圾回收线程就是典型的守护线程. 守护线程和非守护线程的区别是 public stati ...

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

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

  8. 五、线程优先级和守护线程

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

  9. JVM 中的守护线程

    在之前的<详解JVM如何处理异常>提到了守护线程,当时没有详细解释,所以打算放到今天来解释说明一下JVM守护线程的内容. 特点 通常由JVM启动 运行在后台处理任务,比如垃圾回收等 用户启 ...

  10. 线程安全、守护线程、join()

    1. 线程安全 多个线程在访问同一个对象的时候不需要其他额外的同步手段或措施就能保证该对象被正确的访问并产生正确的执行结果.那么这个对象就是线程安全的. 线程安全的代码必须具备一个特征:代码本身封装了 ...

最新文章

  1. JS BOM之location.hash详解
  2. 计算机应用基础是高中吗,职业高中学业水平测试计算机应用基础试卷(A)及答案...
  3. 深入出不来nodejs源码-编译启动
  4. python 深度学习模型训练 多GPU下如何调用
  5. 怎么样做好日志类的报警监控
  6. “天下第一长联”与“元跨革囊”
  7. 线性代数应该这样讲(四)-奇异值分解与主成分分析
  8. Redis 常用配置参数
  9. 大学生职业生涯规划计划与路径_我校举办2020年大学生职业生涯规划大赛
  10. unity, 取消ugui button响应键盘
  11. 基于java的音乐网站的设计与实现
  12. 机器人也会骑车?日本村田顽童来京秀车技
  13. Vue表情包输入组件
  14. MongoDB Compass简易教程
  15. BT3下载 与 BT3 U盘版制作
  16. TDIfw在windows 10 1903的测试
  17. 【JSD-Day01】语言基础第一天
  18. 网页劫持防御方法,网页被劫持怎么办?
  19. windows server 2008解决 远程桌面多帐号同时登录
  20. 解决cc2015到期后不能再次破解问题,及提供cutterman,Mark Man下载地址

热门文章

  1. java时间戳,时间格式之间的转换
  2. coreldraw x7怎么禁网_CorelDRAW X7如何锁定对象和解锁对象
  3. git管理-最详细Gitflow讲解
  4. js中三目运算符优化
  5. 慧通编程第4关 - 魔法学院第6课
  6. 电脑快捷键使用大全整理
  7. python 列表元素倒数第一,第二个访问方法
  8. eclipse编译jar中文乱码解决办法
  9. 调酒壶里的酸奶 DFS
  10. easyPoi二级表头,自定义合并行列方法