Java线程状态变换过程代码解析

作者:Kuris101 时间:2023-08-06 18:05:29 

线程状态

  • NEW:刚创建未启动的线程

  • RUNNABLE:正在执行状态

  • BLOCKED:处于阻塞状态的线程

  • WAITING:正在等待另一个线程执行特定动作的线程

  • TIMED_WAITING:等待另一个线程执行时间到达指定时间

  • TERMINATED:线程退出执行


public class TestState {
 public static void main(String[] args) {
   Thread thread = new Thread(()->{
     for (int i = 0; i < 5; i++) {
       try {
         Thread.sleep(1000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
     System.out.println("/////");
   });

//观察线程状态
   Thread.State state = thread.getState();
   System.out.println(state); //New状态

thread.start();
   state = thread.getState();
   System.out.println(state);//Run状态

while (state!=Thread.State.TERMINATED){
     try {
       Thread.sleep(100);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
     state = thread.getState();//更新线程状态
     System.out.println(state);//输出状态
   }
 }
}

线程礼让

  • 当前正在执行的线程暂停,但是不会阻塞

  • 当前线程失去处理机,编程就绪状态

  • 礼让是否成功取决于CPU,如果礼让成功,则等待下一次调度


public class TestYield {
 public static void main(String[] args) {
   MyYield myYield = new MyYield();

new Thread(myYield,"a").start();
   new Thread(myYield,"b").start();
 }
}

class MyYield implements Runnable{
 @Override
 public void run() {
   System.out.println(Thread.currentThread().getName()+"线程开始执行");
   Thread.yield();
   System.out.println(Thread.currentThread().getName()+"线程停止执行");
 }
}

执行结果:

Java线程状态变换过程代码解析

线程强制执行到结束

  • 使用join()方法

  • 使用join()方法的线程会强制执行直到结束,不会让出处理机


public class TestJoin implements Runnable{
 @Override
 public void run() {
   for (int i = 0; i < 1000; i++) {
     System.out.println("强制执行线程来了"+i);
   }
 }

public static void main(String[] args) throws Exception{
   TestJoin testJoin = new TestJoin();
   Thread thread = new Thread(testJoin);
   thread.start();

for (int i = 0; i < 500; i++) {
     if(i==200){
       thread.join();
     }
     System.out.println("主线程"+i);
   }
 }
}

来源:https://www.cnblogs.com/Kuris101/p/13020803.html

标签:Java,线程,状态
0
投稿

猜你喜欢

  • Android基于ImageView绘制的开关按钮效果示例

    2023-02-22 19:39:11
  • Unity中的PostProcessScene实用案例深入解析

    2021-06-09 04:57:28
  • java Mail邮件接收工具类

    2022-04-24 14:17:17
  • ELK搭建线上日志收集系统

    2021-11-01 17:34:41
  • Android中判断网络连接是否可用及监控网络状态

    2022-09-07 05:24:25
  • Springcloud Eureka配置及集群代码实例

    2021-09-19 05:54:52
  • springboot+nginx+https+linux实现负载均衡加域名访问简单测试

    2022-04-26 22:35:13
  • 适配android7.0获取文件的Uri的方法

    2022-03-13 17:32:06
  • 基于ArrayList源码解析(基于JDK1.8)

    2021-10-07 18:34:25
  • C#导出生成excel文件的方法小结(xml,html方式)

    2023-10-03 16:32:26
  • Java多线程和并发基础面试题(问答形式)

    2022-03-29 17:39:42
  • SpringCloud OpenFeign 服务调用传递 token的场景分析

    2022-12-26 22:24:07
  • C# TaskScheduler任务调度器的实现

    2022-09-30 16:54:21
  • java异步编程之一文看完其异步函数表

    2021-12-25 10:57:39
  • android效果TapBarMenu绘制底部导航栏的使用方式示例

    2023-07-29 20:53:36
  • 详解WPF中的对象资源

    2023-10-28 14:09:41
  • C#实现农历日历的方法

    2022-08-17 21:27:29
  • 详解Java中Math.round()的取整规则

    2022-10-20 14:22:01
  • Android中TelephonyManager类的用法案例详解

    2022-04-30 20:18:32
  • Android手机开发设计之记事本功能

    2023-12-10 21:47:00
  • asp之家 软件编程 m.aspxhome.com