首先回顾下之前的线程的五个状态
创建 等待 执行 阻塞 死亡
线程状态: thread.getState() ,Thread.state(是一个枚举类型 ) 线程key处于以下状态之一
Thread.State state = thread.getState();
pubic static enum Thread.state extends Enum<Thread.statu>
- NEW 尚未启动的线程处于此状态(新生状态)
- RUNNABLE 在Java虚拟机中执行的线程处于此状态 (运行状态)
- BLOCKED 被阻塞等待监视器锁定的线程处于此状态(阻塞状态)
- WAITING 正在等待另一个线程执行特定动作的线程处于此状态(阻塞状态)
- TIMED WAITING 正在等待另一个线程执行执行动作达到执行等待时间的线程处于此状态 (阻塞状态)
- TERMINATED 已退出的线程处于此状态 (终止状态)
package com.wyh.thread; /** * @program: Thread * @description: 测试观察线程性能状态 * @author: 魏一鹤 * @createDate: 2022-01-03 21:58 **/ //观察线程执行状态 public class TestThreadState { public static void main(String[] args) throws InterruptedException { //创建线程 //使用lambda表达式简化代码 在Thread()中写入()->{代码体} Thread thread = new Thread(() -> { for (int i = 0; i < 5; i++) { //这里让线程阻塞(睡眠),时间为1000ms也就是1s,目的是便于观察 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("----------------------------"); }); //观察线程状态 //以上线程为新生状态 因为我们只是创建还没有调用 Thread.State state = thread.getState(); System.out.println("线程state = " + state);//new //启动线程 观察启动后 thread.start();// state = thread.getState(); System.out.println("线程state = " + state);//run //线程跑起来有可能阻塞 有可能死亡,我们需要写个循环一直监听它 //判断线程死亡 Thread.State.TERMINATED // 只要线程不终止 就一直输出状态 while (state!=Thread.State.TERMINATED) { Thread.sleep(100); //更新线程状态 state = thread.getState(); System.out.println("线程state = " + state);//run } //线程停止了之后不能再调用start()方法了 死亡之后的线程就不能再启动了 否则会报错 //Exception in thread "main" java.lang.IllegalThreadStateException thread.start(); } }
死亡之后的
线程停止了之后不能再调用start()方法了 死亡之后的线程就不能再启动了 否则会报错
网络异常,图片无法展示
|
线程的优先级(priority)
它是一个常量
- Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定按照优先级决定应该调度哪个线程来执行
- 线程的优先级用数字表示,范围从1-10,线程优先级高给的资源会多一些, 线程优先级高并不一定先执行,但是权重就大了,比如1张彩票和10张彩票,中奖率就会提高
Thread.min_priority=1;
Thread.max_priority=10;
Thread.norm_priority=5;
使用以下方式改变或者获取优先级
getPriority().setPriority(int xxx )
- 不可以将优先级设置负数或者大于10的数 只能1-10 不然会报错
- 要先设置优先级再启动
- 代码中如果哪行代码比较重要,我们就把它的优先级提升
- 优先级高并不是每次都会优先执行,只是权重大了些,更加容易先执行,具体要看cpu的调度
- 优先级低只是意味着调度的概率低,并不是优先级低就不会被调用了,同理,优先级低并不是每次都会优先执行,而是优先执行概率高,这都是看CPU的调度
package com.wyh.thread; /** * @program: Thread * @description: 测试线程优先级 * @author: 魏一鹤 * @createDate: 2022-01-05 22:08 **/ public class TestThreadPriority{ public static void main(String[] args){ //主线程默认优先级 System.out.println(Thread.currentThread().getName()+"------------>"+Thread.currentThread().getPriority()); MyThreadPriority myThreadPriority = new MyThreadPriority(); Thread thread1 = new Thread(myThreadPriority); Thread thread2 = new Thread(myThreadPriority); Thread thread3 = new Thread(myThreadPriority); Thread thread4 = new Thread(myThreadPriority); Thread thread5 = new Thread(myThreadPriority); Thread thread6 = new Thread(myThreadPriority); Thread thread7 = new Thread(myThreadPriority); Thread thread8 = new Thread(myThreadPriority); //先设置优先级再启动 ///t1直接启动 thread1.start(); //t2设置优先级为1再启动 thread2.setPriority(1); thread2.start(); //t3设置优先级为4再启动 thread3.setPriority(4); thread3.start(); //t3设置优先级为默认最高级(10)再启动 MAX_PRIORITY默认最高级10 thread4.setPriority(Thread.MAX_PRIORITY); thread4.start(); //t7设置优先级为默认最低级(1)再启动 MIN_PRIORITY最高级1 thread7.setPriority(Thread.MIN_PRIORITY); thread7.start(); //t8设置优先级为默认中级(5)再启动 NORM_PRIORITY默认最高级5 thread8.setPriority(Thread.NORM_PRIORITY); thread8.start(); //t5设置优先级为-1 优先级不能设置为负数 不然会报错 thread5.setPriority(-1); thread5.start(); //t6设置优先级为11 优先级不能超过10 不然会报错 thread6.setPriority(11); thread6.start(); } } class MyThreadPriority implements Runnable { @Override public void run() { //Thread.currentThread().getPriority() 线程的优先级 System.out.println(Thread.currentThread().getName()+"------------>"+Thread.currentThread().getPriority()); } }