多线程---线程状态(五大状态)

线程状态

视频参考:多线程11:线程停止哔哩哔哩bilibili

 

 

线程停止:stop()

package com.mokuiran.thread;

/*
测试stop
1.建议线程正常停止-->利用次数,不建议死循环
2.建议使用标志位-->设置一个标志位
3.不要使用stop或者destroy等过时或者JDK不见使用的方法
*/

public class TestStop implements Runnable {

   //1.设置一个标示位
   private boolean flag = true;

   @Override
   public void run() {
       int i = 0;
       while (flag){
           System.out.println("run...Thread"+i++);
      }
  }

   //2.设置一个公开的方法停止线程,转换标志位
   public void stop(){
       this.flag = false;
  }

   //主线程
   public static void main(String[] args) {
       TestStop testStop = new TestStop();
       new Thread(testStop).start();

       for (int i = 0; i < 1000; i++) {
           System.out.println("main"+i);
           if (i == 900){
               //调用stop方法切换标志位,让线程停止
               testStop.stop();
               System.out.println("线程该停止了");//主线程没有停止,run方法内的线程停止了
          }
      }
  }
}

 

 

线程休眠:sleep()

image-20220907125006691

 

单位换算:1000ms = 1s;

案例

package com.mokuiran.thread;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TestSleep2 {

   public static void main(String[] args){
//       tenDown();
       //打印当前系统时间
       Date date = new Date(System.currentTimeMillis());//获取系统当前时间

       while (true){
           try {
               Thread.sleep(1000);
               System.out.println(new SimpleDateFormat("HH:mm:ss").format(date));
               date = new Date(System.currentTimeMillis());//更新当前时间

          } catch (InterruptedException e) {
               e.printStackTrace();
          }


      }
  }

   //模拟倒计时
   public static void tenDown() throws InterruptedException {
       int num = 10;
       while (true){
           Thread.sleep(1000);
           System.out.println(num--);
           if (num<=0){
               break;
          }
      }
  }
}
//模拟网络延时:放大问题的发生性

 

 

线程礼让:yield()

image-20220907133042006

案例

package com.mokuiran.thread;


import org.omg.PortableServer.THREAD_POLICY_ID;

//测试礼让线程
//礼让不一定成功,看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()+"线程停止");
  }
}
//线程不礼让结果为:aabb
//线程礼让结果为:abba(不一定礼让成功)

 

 

线程强制执行:Join()

  • Join合并线程,待此线程执行完成后,在执行其他线程,其他线程阻塞

  • 可以想象成插队

package com.mokuiran.thread;

//测试join方法
//想象为插队
public class TestJoin implements Runnable{
   @Override
   public void run() {
       for (int i = 1; i < 100; i++) {
           System.out.println("线程Vip来了"+i);
      }
  }


   public static void main(String[] args) throws InterruptedException {


       for (int i = 1; i < 1000; i++) {
           if (i==200) {
               TestJoin testJoin = new TestJoin();
               Thread thread = new Thread(testJoin);
               thread.start();//启动线程
               thread.join();//插队
          }
           System.out.println("main"+i);
      }
  }
}

 

 

线程状态观测:Thread.State

线程状态。 线程可以处于以下状态之一:

  • NEW 尚未启动的线程处于此状态。

  • RUNNABLE 在Java虚拟机中执行的线程处于此状态。

  • BLOCKED 被阻塞等待监视器锁定的线程处于此状态。

  • WAITING 无限期等待另一个线程执行特定操作的线程处于此状态。

  • TIMED_WAITING 正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。

  • TERMINATED 已退出的线程处于此状态。

线程在给定时间点只能处于一种状态。 这些状态是虚拟机状态,不反映任何操作系统线程状态。

 
posted @   默夔然  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示