线程的五大状态和方法(加代码解析)

线程的五大状态和方法(加代码解析)

线程停止stop

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

package com.xxgc.state;

//测试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==800){
               //调用stop方法切换标志位,让线程停止
               testStop.stop();
               System.out.println("线程停止了!");
          }
      }
  }
}

线程休眠sleep 延时和倒计时

sleep() 方法定义在Thread.java中,是 static 修饰的静态方法。 sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

package com.xxgc.state;

import com.xxgc.demo01.TestThread4;

//模拟网络延时 :放大问题的发生性
public class TestSleep implements Runnable {
   //票数
   private int ticketNums = 10;

   @Override
   public void run() {
       while (true){
           if(ticketNums<=0){
               break;
          }
           //模拟延时
           try {
               Thread.sleep(100);
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
           System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums--+"张票");
      }
  }

   public static void main(String[] args) {
       TestSleep ticket = new TestSleep();

       new Thread(ticket,"小明").start();
       new Thread(ticket,"老师").start();
       new Thread(ticket,"黄牛").start();
  }
}
package com.xxgc.state;

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

//模拟倒计时...
public class TestSleep2 {
   public static void main(String[] args) {
       try {
           tenDown();
      } catch (InterruptedException e) {
           e.printStackTrace();
      }

       //打印当前系统时间
       Date startTime = new Date(System.currentTimeMillis()); //获取当前系统时间

       while(true){
           try {
               Thread.sleep(1000);
               System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
               startTime = new Date(System.currentTimeMillis()); //更新当前时间
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
      }
  }
   //加static直接调用 模拟倒计时
   public static void tenDown() throws InterruptedException {
       int num = 10;
       while (true){
           Thread.sleep(100);
           System.out.println(num--);
           if(num<=0){
               break;
          }
      }
  }
}

线程礼让yield

礼让不一定成功,看CPU心情

礼让线程,让当前正在执行的线程暂停,但不阻塞 将线程从运行状态转为就绪状态

package com.xxgc.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 理解为插队

package com.xxgc.state;

//测试join方法,想象为插队
public class TestJoin implements Runnable {

   @Override
   public void run() {
       for (int i = 0; i < 500; i++) {
           System.out.println("线程Vip来了"+i);
      }
  }

   public static void main(String[] args) throws InterruptedException {
       //启动我们的线程
       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("main主线程"+i);
      }
  }
}

观测线程状态

package com.xxgc.state;

//观察测试线程的状态
public class TestState {
   public static void main(String[] args) throws InterruptedException {
       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); //RUNNABLE

       //观察启动后
       thread.start(); //启动线程
       state = thread.getState();
       System.out.println(state); //Run

       while (state!= Thread.State.TERMINATED){ //只要线程不终止,就一直输出状态
           Thread.sleep(100);
           state = thread.getState();  //更新线程状态
           System.out.println(state); //输出状态TERMINATED
      }
       thread.start();  //线程停止后就不能再启动,已死亡
       /*
       Exception in thread "main" java.lang.IllegalThreadStateException
       at java.lang.Thread.start(Unknown Source)
       at com.xxgc.state.TestState.main(TestState.java:31)
       */
  }
}

 

posted @ 2020-09-19 16:28  墨染念颖  阅读(198)  评论(0)    收藏  举报