Javaスレッド状態変換プロセスのコード分析

スレッドの状態

  • NEW:開始されていないスレッドを作成しました
  • 実行可能:実行状態
  • BLOCKED:ブロックされた状態のスレッド
  • 待機中:別のスレッドが特定のアクションを実行するのを待機しているスレッド
  • TIMED_WAITING:別のスレッドの実行時間が指定された時間に達するのを待っています
  • 終了:スレッドは実行を終了します
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);//输出状态
    }
  }
}

スレッドポライト

現在実行中のスレッドは一時停止されますが、ブロックされません。
現在のスレッドはプロセッサを失い、プログラミングの準備ができています
。comityが成功するかどうかは、CPUによって異なります。comityが成功すると、次のスケジューリングを待機します。

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);
    }
  }
}

人生は忍耐と勤勉以上のものです。夢は意味のある追求です。
最後に、あなたの研究の早い段階での成功、満足のいくオファー、迅速な昇進と給料の引き上げ、そして人生の頂点に到達することを願っています。
小さなアシスタントvxを追加するためにコースウェアのソースコードソフトウェアやその他の資料が必要な場合:xcw18874131605(注:CSDN)

おすすめ

転載: blog.csdn.net/p1830095583/article/details/115255387