复习JavaDay07

发布时间 2023-05-26 10:22:34作者: 再叙旧

线程的5种状态

新生状态:Thread thread = new Thread();

就绪状态:当调用start()方法,线程立即进入就绪状态,但并不以为着立即调度执行

运行状态:进入运行状态,线程才真正执行线程体的代码块。

阻塞状态:当调用sleep(),wait或者同步锁时,线程进入阻塞状态,就是代码不往下执行

阻塞事件解除后,重新进入就绪状态,等待cpu调度执行。

死亡状态:(dead):线程中断或者结束,一旦进入死亡状态,就不能再次启动。

线程的常用方法

方法说明
setPriority(int newPriority); 更改线程优先级
static void sleep(long millis); 在指定的毫秒数内让当前正在执行的线程休眠
void join(); 等待该线程终止
static void yield(); 暂停当前正在执行的线程对象,并执行其他线程
void intrrupt(); 中断线程,别用这个方式
boolean isAlive(); 测试线程是否处于活动状态

自定义标识位结束线程:案例

不推荐使用JDK提供的stop()和destroy(),推荐线程自己停下来,设置一个变量,例如flag = false,则终止线程。

//设置标识位让线程在指定次数停止
public class TestThreadStop implements Runnable {
  private boolean flag = true;

  @Override
  public void run() {
      int i = 0;
      //这里执行循环
      while (flag) {
          System.out.println(Thread.currentThread().getName() + "运行了第" + i++ + "次");
      }
  }

  public boolean stop() {
      return this.flag = false;
  }

  public static void main(String[] args) {
      //错误示例:原因,在调用sotp方法时就需要new,和现在这个对象不是同一对象了,将陷入死循环
      //new Thread(new TestThreadWay(),"自定义线程").start();

      TestThreadStop t = new TestThreadStop();
      Thread thread = new Thread(t, "自定义线程");
      thread.start();

      //当main线程运行900次时结束掉自定义线程
      for (int i = 0; i < 1000; i++) {
          if (i == 900) {
              System.out.println(Thread.currentThread().getName()+"线程结束了====================");
              t.stop();
              break;
          }
          System.out.println("main------=========" + i);
      }
  }
}

sleep实现计时器案例:

public class TestThreadSleep implements Runnable {

  @Override
  public void run() {
      int time = 0;
      while (true) {
          try {
              Thread.sleep(1000);
              System.out.println(time++);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          if (time == 60) {
              System.out.println("1分钟结束,计时停止");
              break;
          }
      }

  }

  public static void main(String[] args) {
      new Thread(new TestThreadSleep()).start();
  }
}

join() 合并线程:举例线程插队

package com.softeem;

//合并线程 join()
public class TestThreadSleep implements Runnable {

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

  }

  public static void main(String[] args) throws InterruptedException {
      TestThreadSleep t = new TestThreadSleep();
      Thread t1 = new Thread(t);
      t1.start();

      //join()方法实现线程插队,注意:执行较小任务时不适用,会存在争夺时间片问题提前插队
      for (int i = 0; i < 500; i++) {
          System.out.println("排队" + i);
          if (i == 50) {
              t1.join();
          }
      }
  }
}