多线程入门02 —— 线程的状态

1.线程的五大状态

2.线程状态的变化过程

3. 相关方法

方法 说明
setPriority(int newPriority) 设置线程的优先级
static void sleep(long milllis) 线程休眠指定的时间(以毫秒为单位)
void join() 等待该线程终止
static void yield() 礼让他人
void interrupt() 强制中断线程(不推荐使用)
boolean isAlive() 测试线程是否处于活动状态
  • 线程休眠(Sleep)
    • 将线程阻塞制定时间(毫秒)
    • 存在InterruptedException
    • 时间之后,线程进入就绪状态
    • 可用于模拟网络延迟,倒计时等,也可用于放大错误
    • 每个对象都一个锁,sleep不会释放锁
  • 线程礼让(Yield)
    • 让当前正在执行的线程暂停,但不阻塞
    • 将线程从运行状态转换为就绪状态
    • 让CPU重新调度,礼让不一定能成功,全看CPU心情如何
  • 强制执行(Join)
    • 合并线程,待此线程执行完成后,在执行其他线程,其他线程会被阻塞
    • 相当于插队

4.关于停止线程

  • 不推荐使用JDK提供的stop()、destroy()方法 (已过时,且不安全,详见https://www.jianshu.com/p/7686ac6b84f1)

  • 推荐让线程自己停止

    • 利用一个标志位,当标志位处于某种特定状态时,终止线程运行

    • 示例

    • package com.pbx.lesson01;
      
      /**
       * @author BruceXu
       * @date 2020/9/13
       */
      public class ThreadStop implements Runnable {
      
          private boolean flag = true;
      
          public static void main(String[] args) {
              ThreadStop myThread = new ThreadStop();
              new Thread(myThread).start();
              try {
                  Thread.sleep(5);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              myThread.stop();
      
          }
      
          @Override
          public void run() {
              while (flag) {
                  System.out.println("线程正在运行中");
              }
              System.out.println("线程马上退出");
          }
      
          public void stop() {
              this.flag = false;
          }
      
      }
      
      

posted @ 2020-09-18 23:57  PrimaBruceXu  阅读(94)  评论(0编辑  收藏  举报