多线程入门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; } }
-