一.线程的五大状态:创建状态、就绪状态、运行状态、阻塞状态、死亡状态


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

2.就绪状态:new出来以后,当调用start()方法,线程就会立即进入就绪状态,但不意味着立即调度执行。

3.运行状态:处于就绪状态的线程,经过CPU调度就会进入运行状态,线程才会真正执行线程体的代码块。

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

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

二.线程的状态变化:
1.线程停止
不推荐使用JDK提供的stop()、destroy()方法(已废弃),推荐线程自己停下来:建议使用一个标志位进行终止变量,当flag=false时,则终止线程运行。

public class ThreadStop implements Runnable{//1.设置一个标志位private boolean flag = true;@Overridepublic void run() {int i = 0;while (flag){System.out.println("Thread is running..." + i++);}}//2.设置一个公开的方法来停止线程,切换标志位public void stop(){this.flag = false;}public static void main(String[] args) {ThreadStop threadStop = new ThreadStop();new Thread(threadStop).start();for (int i = 0; i < 1000; i++) {System.out.println("main线程" + i);if (i == 900){//调用自己写的stop()方法来停止线程threadStop.stop();System.out.println("线程该停止了");}}}
}

运行结果:

2.线程休眠sleep()方法
sleep(时间)指定当前线程阻塞的毫秒数
sleep存在异常InterruptedException,需要抛异常
sleep时间达到后线程进入就绪状态
sleep可以模拟网络延时、倒计时等功能
每一个对象都有一把锁,sleep不会释放锁

sleep实现倒计时功能:

//倒计时
public class ThreadSleep {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;}}}}

sleep实现获取当前时间的功能:

import java.text.SimpleDateFormat;
import java.util.Date;//获取当前体统时间
public class ThreadSleep2 {public static void main(String[] args) {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();}}}
}

3.线程礼让yield()方法
线程礼让:让当前正在执行的线程停止,但并不是阻塞,将线程状态从运行状态转为就绪状态,让CPU重新调度,线程重新竞争;礼让不一定成功,看CPU心情

//线程礼让
public class ThreadYield {public static void main(String[] args) {MyYield myYield = new MyYield();new Thread(myYield, "a").start();new Thread(myYield, "b").start();}
}class MyYield implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "线程开始执行");Thread.yield();  //礼让System.out.println(Thread.currentThread().getName() + "线程停止执行");}
}

结果:
礼让成功:

礼让失败:

4.线程强制执行join()
可以想象成插队,待此线程执行完毕后,再执行其他线程,其他线程阻塞

//测试join  方法
public class ThreadJoin implements Runnable{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("我要插队!" + i);}}public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 1000; i++) {if (i == 200){ThreadJoin threadJoin = new ThreadJoin();Thread thread = new Thread(threadJoin);thread.start();thread.join();}System.out.println("main" + i);}}}

线程的五大状态及转换相关推荐

  1. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  2. java线程6种状态转换,Java线程的生命周期和各种状态转换详解

    在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期.当Thread对象创建完成时,线程的生命周期便开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exceptio ...

  3. java 禁止使用多线程_Java多线程(四)-线程状态的转换 - Java 技术驿站-Java 技术驿站...

    一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法 ...

  4. Java线程详解(4)-线程状态的转换

    一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可以分为五大状态.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行, ...

  5. JAVA线程间的状态转换

    线程间的状态转换:  1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运 ...

  6. java线程主要状态及转换_Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

  7. 线程打印状态_Java线程状态的转换

    根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图: BLOCKED与RUNNABLE状态的转换 我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放.假如这里有两个线程a和b, ...

  8. Java线程状态及转换

    推荐:Java并发编程汇总 Java线程状态及转换 原文地址 Java线程状态和关闭线程的正确姿势 正文 Java中的线程有六种状态,使用Thread类中的枚举类来实现,如下,我对每个状态都进行了一定 ...

  9. Java线程状态及其转换

    Java线程的状态及转换 线程状态及其转换 线程的状态 详细介绍: 新建状态(NEW): 就绪状态(RUNNABLE): 运行状态(RUNNING): 阻塞状态(BLOCKED): 等待状态(WAIT ...

最新文章

  1. docker 厂商 容器_中国容器厂商综合实力排名,新鲜出炉!
  2. oracle分区交换速度,oracle交换分区对数据的加载提速案例
  3. Jquery获取ckEditor的内容
  4. 《第3选择》学习笔记
  5. matlab 2017 ubuntu,ubuntu安装matlab R2017,
  6. jdbctemplate 开启事务_Spring(四):事务管理
  7. 【itext学习之路】--6.将html转成pdf(解决中文不显示)
  8. 安装pypcap = 安装flex:the fast lexical analyser + 安装libpcap-1.7.4
  9. 新来的同事把公司现有项目的性能优化了一遍,来看看他是怎么做到的
  10. RedisJson 横空出世,性能碾压ElasticSearch 和Mongo!
  11. 先学python再学c_初学者Python和C先学哪个好?
  12. 伪类如何动态在html设置样式,VUE项目中对伪类动态设置样式
  13. C语言常用的库函数 (自用)
  14. Scintilla教程(5): 选中
  15. mysql联合索引原理
  16. shell以分号结尾_linux shell 各种分号,括号使用方法总结
  17. ERROR: failed to establish dependency between database sgerp5 and diskgroup resource ora.DATA.dg
  18. EXCEL之REPT(),让数据更直观!
  19. Keil软件使用及流水灯设计
  20. html 点击加入qq群,怎么样加入QQ群?加入QQ群两种方式介绍

热门文章

  1. 【转】Jenkins怎么启动和停止服务
  2. 1. 搭建scapy
  3. BootStrap中Affix控件的使用方法及如何保持布局的美观
  4. 卸掉包袱,诺基亚将走得更远
  5. exchange2003的简单安装方法
  6. spring整合hibernate初步
  7. 【项目经验】自动回声消除(AEC)原理
  8. javascript实例自学手册光盘源码_零基础,自学编程,如何选择语言?
  9. python spider是什么_python分布式爬虫中spider_Worker节点指的是什么
  10. sps忘记保存文档怎么恢复_路由器管理员密码忘了怎么办【解决方法】