线程的生命周期

一个线程对象在它的生命周期内,需要经历5个状态。

1.  新生状态(New): 用new关键字建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态。

2. 就绪状态(Runnable): 处于就绪状态的线程已经具备了运行条件,但是还没有被分配到CPU,处于“线程就绪队列”,等待系统为其分配CPU。就绪状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会进入执行状态。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。有4中原因会导致线程进入就绪状态:

1. 新建线程:调用start()方法,进入就绪状态;

2. 阻塞线程:阻塞解除,进入就绪状态;

3. 运行线程:调用yield()方法,直接进入就绪状态;

4. 运行线程:JVM将CPU资源从本线程切换到其他线程。

3. 运行状态(Running):在运行状态的线程执行自己run方法中的代码,直到调用其他方法而终止或等待某资源而阻塞或完成任务而死亡。如果在给定的时间片内没有执行结束,就会被系统给换下来回到就绪状态。也可能由于某些“导致阻塞的事件”而进入阻塞状态。

4. 阻塞状态(Blocked):阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪)。有4种原因会导致阻塞:

1. 执行sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。当指定的时间到了后,线程进入就绪状态。

2. 执行wait()方法,使当前线程进入阻塞状态。当使用nofity()方法唤醒这个线程后,它进入就绪状态。

3. 线程运行时,某个操作进入阻塞状态,比如执行IO流操作(read()/write()方法本身就是阻塞的方法。只有当引起该操作阻塞的原因消失后,线程进入就绪状态。

4. join()线程联合: 当某个线程等待另一个线程执行结束后,才能继续执行时,使用join()方法。

5. 死亡状态(Terminated): 死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有两个。一个是正常运行的线程完成了它run()方法内的全部工作; 另一个是线程被强制终止,如通过执行stop()或destroy()方法来终止一个线程(注:stop()/destroy()方法已经被JDK废弃,不推荐使用)。当一个线程进入死亡状态以后,就不能再回到其它状态了。


终止线程
 * 1. 线程正常执行完毕--》次数
 * 2. 外部干涉--》加入标识
 * 不要使用stop destroy

/*** 终止线程* 1. 线程正常执行完毕--》次数* 2. 外部干涉--》加入标识* 不要使用stop destroy* @author Administrator**/
public class TerminateThread implements Runnable{//1. 加入标识 标记线程体是否可以运行private boolean flag=true;private String name;public TerminateThread(String name) {this.name = name;}@Overridepublic void run() {int i=0;//2.关联标识, true-->运行 false-->停止while(flag) {System.out.println(name+"---->"+i++);       }}//3.对外提供方法改变标识public void terminate() {this.flag=false;}public static void main(String[] args) {TerminateThread tt=new TerminateThread("止兮");new Thread(tt).start();for(int i=0;i<=99;i++) {if(i==88) {tt.terminate();//线程的终止System.out.println("tt game over");}System.out.println("main-->"+i);}}}


sleep模拟网络延时、倒计时

sleep模拟网络延时,放大了发生问题的可能性

/*** sleep模拟网络延时,放大了发生问题的可能性* @author Administrator**/
public class BlockedSleep01 implements Runnable{//票数private int ticketNums=99;@Overridepublic void run() {while(true) {if(ticketNums<0) {break;}//模拟延时try {Thread.sleep(200);  //相当于网络延时问题。会造成数据的不准确性} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"--->"+ticketNums--);}// TODO Auto-generated method stub}public static void main(String[] args) {//一份资源BlockedSleep01 web=new BlockedSleep01();System.out.println(Thread.currentThread().getName());//多个代理new Thread(web,"马畜").start();new Thread(web,"码农").start();new Thread(web,"码蝗").start();}
}


sleep 模拟休息

//sleep 模拟休息
public class BlockedSleep02 implements Runnable{private String winner; //胜利者@Overridepublic void run() {for(int steps=1;steps<=100;steps++) {//模拟兔子休息if(Thread.currentThread().getName().equals("rabbit")&&steps%10==0) {try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(Thread.currentThread().getName()+"--->"+steps);//比赛是否结束boolean flag=gameOver(steps);if(flag) {break;}}}private boolean gameOver(int steps) {if(winner!=null) {//存在胜利者return true;}else {if(steps==100) {winner=Thread.currentThread().getName();System.out.println("winner==>"+winner);return true;}}return false;}public static void main(String[] args) {BlockedSleep02 BlockedSleep02=new BlockedSleep02();new Thread(BlockedSleep02,"tortoise").start();new Thread(BlockedSleep02,"rabbit").start();}
}


sleep 模拟倒计时

/*** sleep 模拟倒计时* @author Administrator**/
public class BlockedSleep03 {/*** @param args* @throws InterruptedException*/public static void main(String[] args) throws InterruptedException {// 倒数10个数,一秒一个int num=10;while(true) {Thread.sleep(1000);System.out.println(num--);if(num<0) {break;}}}
}
import java.text.SimpleDateFormat;
import java.util.Date;/*** sleep 模拟倒计时* @author Administrator**/
public class BlockedSleep03 {public static void main(String[] args) throws InterruptedException {//倒计时Date endTime=new Date(System.currentTimeMillis()+1000*10);  //倒计时10秒long end=endTime.getTime();while(true) {System.out.println(new SimpleDateFormat("mm:ss").format(endTime));Thread.sleep(1000);endTime=new Date(endTime.getTime()-1000);if(end-10000>endTime.getTime()) {break;}}}public static void test() throws InterruptedException {// 倒数10个数,一秒一个int num=10;while(true) {Thread.sleep(1000);System.out.println(num--);if(num<0) {break;}}}
}


yield 礼让线程,暂停线程  直接进入就绪状态 而不是进入阻塞状态

/*** yield 礼让线程,暂停线程  直接进入就绪状态 而不是进入阻塞状态* @author Administrator**/
public class YieldDemo01 {public static void main(String[] args) {MyYield my=new MyYield();new Thread(my,"a").start();new Thread(my,"b").start();}
}class MyYield implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"-->start");Thread.yield();  //礼让 从运行态到就绪态System.out.println(Thread.currentThread().getName()+"-->end");}}


public class YieldDemo02 {public static void main(String[] args) {new Thread(()->{for(int i=0;i<100;i++) {System.out.println("lambda……"+i);}}) .start();for(int i=0;i<100;i++) {if(i%20==0) {Thread.yield(); //main线程礼让}System.out.println("main....."+i);}}
}


join:合并线程 插队线程

/*** join:合并线程 插队线程* @author Administrator**/
public class BlockedJoin01 {public static void main(String[] args) throws InterruptedException {Thread t= new Thread(()->{for(int i=0;i<100;i++) {System.out.println("lambda……"+i);}});t.start();for(int i=0;i<100;i++) {if(i==20) {t.join();  //插队 main主线程被阻塞了}System.out.println("main....."+i);}}
}

Java的知识点28——线程的生命周期相关推荐

  1. Java并发编程:线程的生命周期是个怎样的过程?

    前言 在日常开发过程中,如果我们需要执行一些比较耗时的程序的话,一般来说都是开启一个新线程,把耗时的代码放在线程里,然后开启线程执行.但线程是会耗费系统资源的,如果有多个线程同时运行,互相之间抢占系统 ...

  2. java并发编程之线程的生命周期详解

    java线程从创建到销毁,一共会有6个状态,不一定都经历,有可能只经历部分: NEW:初始状态,线程被创建,但是还没有调用start方法. RUNNABLED:运行状态,java线程把操作系统中的就绪 ...

  3. java main生命周期_Java从入门到入土(62)线程的生命周期

    线程是程序内部的一个顺序控制流,他具有一个特定的生命周期.在一个线程的生命周期中,他总是处于某一种状态中.线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务. 线程的生命周期包括五个状 ...

  4. java -- 线程的生命周期

    线程的生命周期 1.线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread)当创建Thread类的一个实例(对象)时,此线程进入新 ...

  5. java for(o t :object) 获取顺序号_java中线程的生命周期

    线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发. java中Thread的状态 java中Thread有6种状态,分别是: NEW – 新创 ...

  6. Java并发编程的基础-线程的生命周期

    Java线程既然能够创建,那么也势必会被销毁,所以线程是存在生命周期的,那么我们接下来从线程的生命周期开始去了解线程. 线程一共有6种状态(NEW.RUNNABLE.BLOCKED.WAITING.T ...

  7. 图解 Java 线程的生命周期,看完再也不怕面试官问了

    文章首发自个人微信公众号: 小哈学Java www.exception.site/java-concur- 在 Java 初中级面试中,关于线程的生命周期可以说是常客了.本文就针对这个问题,通过图文并 ...

  8. java中线程的生命周期

    文章目录 java中Thread的状态 NEW Runnable BLOCKED WAITING TIMED_WAITING TERMINATED java中线程的生命周期 线程是java中绕不过去的 ...

  9. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

最新文章

  1. usaco ★Agri-Net 最短网络
  2. 面向对象三大特性一一封装(encapsulation)
  3. ASP.NET连接带密码Access的方法
  4. Nginx 学习 —— 负载均衡
  5. 纯CSS实现漂亮圆角阴影边框
  6. js var是什么类型_JS变量的执行环境和生命周期
  7. MDOP套装之app-v安装使用及功能说明
  8. python和uipath区别_Uipath中调用Python的方法
  9. iOS 网络编程(二)
  10. 我为什么想并且要学习Scala
  11. Nginx网站使用CDN之后禁止用户真实IP访问的方法
  12. 怎样快速修改论文格式-使用人工智能技术助手
  13. html怎么修改网页背景色,CSS如何设置网页背景颜色、背景图片
  14. 笔记本vmware利用无线网卡上网设置
  15. Spire.Office for .NET 7.4.10 is released
  16. 树莓派linux led字符设备驱动(互斥)
  17. 自动化冒烟测试:Unittest vs Pytest框架
  18. Linux切换中英文环境
  19. CSS3变形和动画:旋转、扭曲、缩放、位移、矩阵 、原点 transform-origin、过渡属性 transition-property、过渡所需时间 transition-duration...
  20. 不能为虚拟电脑**打开一个新任务 VT-x is disabled in the BIOS for all CPU

热门文章

  1. haproxy 同一域名下分发请求
  2. NIO和Reactor
  3. AS3.0 正则表达式规则
  4. MSM8909平台 LED背光的控制
  5. WINCE Launch函数分析
  6. MySQL:Innodb DB_ROLL_PTR指针解析
  7. Jboss7或者wildfly部署war包的问题
  8. 关于java中死锁的总结
  9. CSVHelper在Asp.Net MVC中的使用
  10. 编程之美——2.7 求最大公约数