当前位置: 首页 > 编程笔记 >

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

景永春
2023-03-14
本文向大家介绍Java线程状态变换过程代码解析,包括了Java线程状态变换过程代码解析的使用技巧和注意事项,需要的朋友参考一下

线程状态

  • 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()+"线程停止执行");
  }
}

执行结果:

线程强制执行到结束

  • 使用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);
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • > 我是Java多线程的新手。想知道线程池执行器中空闲线程的状态。它在RUNNABLE/WAITING中吗? 如果空闲线程处于RUNNABLE状态,新任务如何附加到空闲线程?AFAIK我们为线程/池分配一个可运行/可调用的对象。但我的问题是ThreadPoolExecitor如何将排队的可运行对象分配给空闲线程??

  • 有人能给我解释一下VisualVM中、、和线程状态之间的区别吗。 这是我发现的: :线程仍在运行 :线程正在Hibernate(对线程对象调用了方法yield()) :线程被互斥锁或屏障阻止,正在等待另一个线程释放锁 :停止的线程被暂停,直到获得许可。解压线程通常是通过调用线程对象上的方法unpark()来完成的。 :线程正在等待条件变为true以恢复执行 我无法理解的是州立公园,到底是什么让这条

  • 本文向大家介绍Java线程池框架核心代码解析,包括了Java线程池框架核心代码解析的使用技巧和注意事项,需要的朋友参考一下 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的。线程池应运而生,成为我们管理线程的利器。Java 通过Executor接口,提供了一种标准的方法将任务的提交过程和执行过程解耦开来,并用Runnable表示任务。 下面,我们来分析一下

  • 本文向大家介绍IOS多线程开发之线程的状态,包括了IOS多线程开发之线程的状态的使用技巧和注意事项,需要的朋友参考一下 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行。改变这种状况可以从两个角度出发:对于单核处理器,可以将多个

  • 用例:每次我需要处理一个作业时创建一个新线程。 目前的实现:我使用的执行器服务与固定大小的线程池,例如50。对于每个作业,我都向executor服务提交一个新线程。 我试图实现的行为更像是自动伸缩。在高峰时间跨越更多的服务器(在本例中是线程)。并在负载不是很高的时候终止额外的服务器并保持最小的服务器计数。

  • 如何从多个线程同时访问静态变量。 如果我有这样的课 我需要访问线程1的值,比如 从线程2中,我需要设置如下值 这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。