1. 观测线程状态

Thread.State 可以处于一下几种状态

  • NEW:尚未启动的线程处于此种状态
  • RUNABLE:在Java虚拟机中执行的线程处于此种状态
  • BLOCKED:被阻塞等待监视器锁定的线程处于此种状态
  • WAITING:正在等待另一个线程执行特定动作的线程处于此种状态
  • TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程处于此种状态
  • TERMINATED:已退出的线程处于此种状态
//观察测试线程的状态
public class TestState {public static void main(String[] args) {Thread thread = new Thread(()->{for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("//");});//观察状态Thread.State state = thread.getState();System.out.println(state);//观察启动后状态thread.start();state = thread.getState();System.out.println(state);while (state!= Thread.State.TERMINATED){//只要线程不终止,就一直检测线程状态state = thread.getState();//更新状态System.out.println(state);}//一旦进入死亡状态,就不能再次重启}
}

2. 线程优先级

  • Java提供一个线程调度器来监控程序中启动进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。
  • 线程优先级用数字表示,范围从1~10。Thread.MIN_PRIORITY=1、Thread.MAX_PRIORITY=10、Thread.NORM_PRIORITY=5
  • 使用getPriority().setPriority(int )改变或者获取线程优先级
  • 优先级高的不一定先执行
//测试现场优先级
public class TestPrioroty{public static void main(String[] args) {//输出主函数的优先级System.out.println(Thread.currentThread().getName()+"==="+Thread.currentThread().getPriority());MyPriority myPriority = new MyPriority();Thread thread1 = new Thread(myPriority);Thread thread2 = new Thread(myPriority);Thread thread3 = new Thread(myPriority);Thread thread4 = new Thread(myPriority);Thread thread5 = new Thread(myPriority);thread1.start();thread2.setPriority(7);thread2.start();thread3.setPriority(2);thread3.start();thread4.setPriority(Thread.NORM_PRIORITY);thread4.start();}
}class MyPriority implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"==="+Thread.currentThread().getPriority());}
}

3.守护(daemon)线程

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 守护线程如:后台操作日志、监控内存、垃圾回收等
//例:人是短暂存在的(用户线程),神是永恒的(守护线程),当人离开后,神也会停止======虚拟机不会等待守护线程执行完毕!
public class TestDaemon {public static void main(String[] args) {Person person = new Person();God god = new God();Thread thread = new Thread(god);thread.setDaemon(true);//默认是false表示用户线程,正常的线程都是用户线程。在此表示设置为守护线程thread.start();new Thread(person).start();}
}
//人是短暂的
class Person implements Runnable{@Overridepublic void run() {for (int i = 0; i < 30000; i++) {System.out.println("i am person");}}
}
//神是永恒的
class God implements Runnable{@Overridepublic void run() {while (true){System.out.println("i am god");}}
}

【多线程-线程状态、优先级、守护线程】相关推荐

  1. 线程状态,优先级,守护线程基础详解

    线程状态,优先级,守护线程基础详解 线程状态 停止线程 线程休眠 线程礼让 线程强制执行 线程状态检测 线程的优先级 守护线程 线程同步 线程状态 创建状态(new 之后就是创建状态 就绪状态(调用s ...

  2. 多线程、并发/并行、自定义线程类、线程安全、守护线程、定时器、线程状态、线程池

    目录 进程和线程: 进程: 线程: 多线程的好处: 线程调度: 分时调度: 抢占式调度: 并发与并行: 线程的生命周期: 实现线程的两种基本方式(还有第三种): 创建Thread线程类: 创建Runn ...

  3. python多线程threading之阻塞线程(join)线程同步和守护线程(setDaemon(True))实例详解

    一.多线程(主线程和子线程同时执行) 1.主线程是程序本身,看不到的,主线程和子线程没有依赖关系,同步执行的,若主线程先执行完,会等子线程执行完毕,程序结束 2.启动一个线程就是把一个函数传入并创建T ...

  4. 多线程基础-守护线程与非守护线程

    守护线程与非守护线程 1.线程分类: 2.程序线程: 3.主线程与非守护线程 4.主线程与守护线程 5.主线程.守护线程.非守护线程 6. java虚拟机是如何退出的? 1.线程分类: 守护线程 非守 ...

  5. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

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

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

  7. Java的守护线程和非守护线程

    一.守护线程 java分为两种线程:用户线程和守护线程 守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此 ...

  8. 守护线程与非守护线程的区别

    守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一 ...

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

    守护线程最典型的应用就是GC,它是一个很好的守护者. 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程) ...

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

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

最新文章

  1. gunicorn源码分析
  2. AS400: 对象属性Domain和State
  3. Eureka深入理解
  4. TCP三次握手及其背后的缺陷
  5. java获取cpu使用率_再一次生产 CPU 高负载排查实践
  6. Linux学习之diction的编译与使用
  7. 流量卡物联网卡管理平台源码|PHP管理系统源码
  8. cocos2d-x中的尺寸之一
  9. 服务注册中心---服务发现nacos
  10. 使用高德地图打车软件实现_强化学习:使用Q学习来打车!
  11. JAVA用键盘钩子_c#键盘钩子
  12. 删除了项目下的\WEB-INF\classes文件夹,在eclipse的tomcat部署启动时报错。
  13. 大学生活的真实写照(经典)
  14. “硬件极客”:树莓派Raspberrypi安装Kali Linux保姆教程(通过树莓派安装ARM Kali教程)
  15. Ubuntu下 VS code安装并配置C/C++模块
  16. 2018-2019金融周期下的武汉楼市和政策解析
  17. java中instant_Instant
  18. 基于ArcGIS与高分影像进行绿地变化分析
  19. matlab sisotool工具DEMO
  20. 智佩店装完成千万级天使轮融资,深耕连锁店装

热门文章

  1. 随机变量和的分布—卷积公式distribution convolution的应用
  2. 杨强、陈强教授新作,《隐私计算》重磅发布!
  3. debian的几个lib源_Debian源
  4. 如何用Tomcat布署Cesium开源三维地球
  5. jquery fancybox插件
  6. 工行网银被盗200万 谁来为此买单?
  7. 他们做了一个令国人振奋的工业互联网项目
  8. 洪山一小书城路分校 第17周 课程表
  9. Siri vs 其他 AI 助手:Apple 落后了吗?
  10. 惠普HP PSC 1118 一体机驱动