多线程学习笔记03线程状态,前端开发者跳槽必备

37 阅读2分钟

简介

在这里插入图片描述

  1. 创建状态:Thread t = new Thread()线程对象一旦创建就进入到了新生状态;

  2. 就绪状态:当调用start()方法,线程立即进入就绪状态,但不意味着立即调度执行;

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

  4. 阻塞状态:当调用sleep, wait或同步锁定时,线程进入阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态,等待cpu调度执行;

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

线程方法

| 方法 | 说明 |

| --- | --- |

| setPriority(int newPriority) | 更改线程的优先级 |

| static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程体休眠 |

| void join() | 等待该线程终止 |

| static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |

| void interrupt() | 中断线程(不建议使用) |

| boolean isAlive() | 测试线程是否处于活动状态 |

线程停止

  • 不推荐使用JDK提供的stop()\destroy()方法。(已废弃)

  • 推荐线程自己停止下来

  • 建议使用一个标志位进行终止变量,当flag=false,则终止线程运行。

在这里插入图片描述

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("线程该停止了");

}

}

}

}

运行结果:

在这里插入图片描述

线程休眠

  • sleep (时间)指定当前线程阻塞的毫秒数;

  • sleep存在异常InterruptedException;

  • sleep时间达到后线程进入就绪状态;

  • sleep可以模拟网络延时,倒计时等。

  • 每一个对象都有一个锁,sleep不会释放锁。

模拟倒计时:

//模拟倒计时

public class TestSleep {

public static void main(String[] args) {

try {

tenDown();

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

}

}

}

}

运行结果:

在这里插入图片描述

线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞;

  • 将线程从运行状态转为就绪状态;

  • 让cpu重新调度,礼让不一定成功,看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)

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

  • 可以想象成插队

//join方法

public class TestJoin implements Runnable {

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

System.out.println("线程vip来了" + i);

}

}

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

//启动线程

TestJoin testJoin = new TestJoin();

Thread thread = new Thread(testJoin);

//主线程

for (int i = 0; i < 500; i++) {

if (i == 200) {

thread.start();

thread.join();//插队

}

System.out.println("main" + i);

}

}

}

运行结果:

在这里插入图片描述

线程状态观测

Thread.State

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

  • NEW

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

  • RUNNABLE

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

  • BLOCKED

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

  • WAITING

正在等待另一个线程执行动作达到指定等待时间的线程处于此状态

  • TIMED_WAITING

正在等待另一个线程执行动作达到指定等待时间的线程处于此状态

  • TERMINATED

已退出的线程处于此状态

一个线程可以在给定时间点处于一个状态。这些状态是不反映任何操作系统线程状态的虚拟机状态。

//观察测试线程的状态

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

//观察启动后

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》

前端面试题宝典

前端校招面试题详解

开源分享:docs.qq.com/doc/DSmRnRG…