线程状态:
与人有生老病死一样,线程也同样要经历新建、就绪、运行(活动)、阻塞和死亡五种不同的状态。这五种状态
都可以通过Thread类中的方法进行控制。创建并运行线程:
① 新建状态(New Thread):在Java语言中使用new 操作符创建一个线程后,该线程仅仅是一个空对象,
它具备类线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态。
线程处于创建状态时,可通过Thread类的方法来设置各种属性,如线程的优先级(setPriority)、
线程名(setName)和线程的类型(setDaemon)等。② 就绪状态(Runnable):使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,
使该线程处于就绪状态。此外,如果某个线程执行了yield()方法,那么该线程会被暂时剥夺CPU资源,
重新进入就绪状态。③ 运行状态(Running):Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。
此时,系统真正执行线程的run()方法。④ 阻塞和唤醒线程
阻塞状态(Blocked):一个正在运行的线程因某些原因不能继续运行时,就进入阻塞状态。这些原因包括:a)当执行了某个线程对象的sleep()等阻塞类型的方法时,该线程对象会被置入一个阻塞集内,等待超时而自动苏醒。b) 当多个线程试图进入某个同步区域时,没能进入该同步区域的线程会被置入锁定集,直到获得该同步区域的锁,进入就绪状态。c)当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集中,直到执行了该对象的notify()方法wait()/notify()方法的执行要求线程首先获得该对象的锁。⑤ 死亡状态(Dead):线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()
或stop()方法,那么它也会以异常退出的方式进入死亡状态。终止线程的三种方法
① 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止,推荐使用。
② 使用stop方法强制终止线程(这个方法不推荐使用,因为stop和suppend、resume一样,也可能
发生不可预料的结果)。
③ 使用interrupt方法中断线程。

java多线程回顾2:生命周期与控制

1、  线程生命周期概述
线程的生命周期如下图:

2、  新建与就绪当程序使用new关键字创建一个线程之后,线程就处于新建状态了。此时线程只是被分配了内存资源,
初始化了成员变量。当线程对象被调用了start()方法之后,该线程就处于就绪状态了。表示这个线程可以运行但还没有运行,
至于线程何时开始运行,取决于jvm的线程调度器。有一点值得注意,启动线程应该使用start()方法,而不是run()方法。如果使用run()方法,程序会把
run()方法当成一个普通方法立刻执行,而不会启动新线程。此外,也不可以对已就绪的线程再次调用start()方法,会引发异常。3、  阻塞与运行
当就绪的线程获得CPU资源开始执行方法体,该线程就变成运行状态。当线程在运行的过程中被中断,则线程变为阻塞状态。被阻塞的线程在合适的时候会重新进入就绪状态,
然后再次获取CPU资源,进入运行状态。以下情况将使线程进入阻塞状态:
线程调用sleep方法,主动放弃所占CPU资源。
线程掉用了一个阻塞式IO方法,在方法返回前,线程被阻塞。
线程试图获取一个同步锁,但是该锁被其他线程占有。
线程在等待通知(线程同步notify)
线程调用suspend方法挂起。该方法容易死锁,少用。以下情况将解除阻塞状态,使线程重新进入就绪状态:
sleep方法计时结束
阻塞式IO方法已经返回
获取了同步锁
等到了其他线程发出的通知
调用resume方法解除了挂起状态此外,调用yield方法可以使运行状态的线程直接转入就绪状态。4、  线程死亡
以下三种情况时线程将死亡。
run()方法执行结束,线程结束。
线程抛出了一个未捕获的Exception或Error
调用了线程的stop()方法。该方法容易死锁,少用。5、线程控制
举个例子,线程A在执行中调用线程B的join方法,线程A将被阻塞,直到线程B执行完为止。线程代码如下:
//通过实现Runnable接口创建线程类public class ThreadTwo implements Runnable{private int i;//run方法同样是线程的执行体@Overridepublic void run() {for (i = 0; i < 5; i++) {//实现Runnable接口创建线程类时,只能使用Thread.currentThread()来获取当前线程System.out.println(Thread.currentThread().getName()+" "+i);}}}public class TestThreadJoin {public static void main(String[] args) throws InterruptedException {ThreadTwo st = new ThreadTwo();new Thread(st,"打酱油的线程").start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+" "+i);if (i==2) {ThreadTwo st2 = new ThreadTwo();Thread thread = new Thread(st2,"被join的线程");thread.start();//main线程调用了thread线程的join方法,必须等thread执行结束才会向下执行thread.join();}}}}main 0打酱油的线程 0main 1打酱油的线程 1main 2打酱油的线程 2打酱油的线程 3被join的线程 0打酱油的线程 4被join的线程 1被join的线程 2被join的线程 3被join的线程 4main 3main 4main 5main 6main线程的i等于2时,启动了“被join的线程”,这时main线程进入阻塞状态,只有“打酱油的线程”“
被join的线程”在运行,等“被join的线程”运行完了,main线程才重新开始运行。5.2后台线程
后台线程也称“守护线程”或“精灵线程”。jvm的垃圾回收线程就是典型的后台进程。一般线程在被创建之后,其生命周期是独立的。而后台进程的生命周期与前台进程相关:当所有前台进程都
死亡,后台进程也随之死亡。使用thread.setDaemon(true)可将线程设为后台线程,且必须在线程启动前设置。前台线程创建的线程默认为前台线程。后台线程创建的线程默认为后台线程。5.3线程睡眠sleep
Sleep方法是Thread类提供的一个静态方法,让当前线程进入阻塞状态,时间到了之后,线程会自动转入
就绪状态。5.4线程让步yield
yield方法和sleep方法类似,也是一个Thread类提供的静态方法,和sleep不同的是,yield是让线程转入
就绪状态。
当某个线程调用了yield方法后,和当前线程优先级一样,或更高的线程会转入运行状态。5.5线程优先级
Thread类提供了setPriority(int newPriority)方法和getPriority()方法来设置和获取线程优先级,
优先级的范围通常在1-10之间,10是最高优先级。
不过不同系统的优先级数值可能不同,所以通常推荐使用Thread类的三个静态常量来设置优先级,
分别是MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY。

多线程——线程的生命周期相关推荐

  1. Java 多线程— 线程的生命周期及方法

    2019独角兽企业重金招聘Python工程师标准>>> 这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有 ...

  2. 一心多用多线程-线程的生命周期

    想起前段时间做校招的时候经常会被问到线程的生命周期问题,现在结合api做一下归纳 1.新建状态 new Thread() 创建一个线程,现在的线程并没有具备运动能力的,可以想象你新建了一只兔子,但是这 ...

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

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

  4. java中线程调度遵循的原则_Java 多线程(三) 线程的生命周期及优先级

    线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处 ...

  5. 线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)

    (一)线程基本概念 一. 程序, 进程, 线程的概念 程序: 使用某种语言编写一组指令(代码)的集合,静态的 进程: 运行的程序,表示程序一次完整的执行, 当程序运行完成, 进程也就结束了 个人电脑: ...

  6. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  7. 【多线程】线程的生命周期

    搞懂生命周期中各个节点的状态转换机制. 通用的线程生命周期 初始状态:指的是线程已经被创建,但是还不允许分配CPU执行.(这里的被创建,仅仅是在编程语言层面被创建,而在操作系统层面,真正的线程还没有创 ...

  8. 线程的生命周期其实没有我们想象的那么简单!!

    来自:冰河技术 写在前面 在[高并发专题]中的<高并发之--线程与多线程>一文中,我们简单介绍了线程的生命周期和线程的几个重要状态,并以代码的形式实现了线程是如何进入各个状态的.今天,我们 ...

  9. 线程的生命周期和状态控制

    为什么80%的码农都做不了架构师?>>>    一.线程的生命周期 线程状态转换图: 其中Thread.join()调用的是Object.wait()方法实现的,意思是让当前线程等待 ...

最新文章

  1. Centos5.6 VNC安装配置【无错版】
  2. leetcode--链表的设计--python
  3. 十分钟上手2022latex安装与入门
  4. c++学习书籍推荐《Visual C++2008入门经典》下载
  5. python编程题-python编程练习题目
  6. linux下屏幕太靠右了,怎么消除linux下的屏幕偏移现象和调整屏幕刷新率?
  7. Angular的Zone-Evergreen在SAP Spartacus中的应用
  8. Day03:文件打开;错误处理
  9. 他,TypeScript GitHub Star 上海第一,全国第四!GitHub 总标星超两万!
  10. Java创新型模式_java设计模式--创建型模式(一)
  11. 洛谷P1312 Mayan游戏
  12. C# 4.0 实现 Method Missing
  13. java基础语法(二)--单列模式
  14. 前序遍历、中序遍历和后续遍历
  15. 郝斌c语言96-99,《祁连山Photoshop CS3专家讲堂系列教程》[ISO]
  16. 8305天距离梦想还有8,352 千米 2012-03-31 23:18:53 柏林勃兰登堡门 再过两天就是我22周岁生日了,我在生命网站上摁下自己的出生年月,上面显示我已经度过了8305天,走
  17. 阿里mysql密码_阿里云自带mysql 密码
  18. 细谈Type-C、PD原理(上/下)
  19. excel图表美化:用散点标记制作不一样的折线图
  20. 高度设置php,uedit设置固定高度

热门文章

  1. Android TextView全属性
  2. nand ubi -3 uboot和ubi
  3. SpringMVC配置类WebMvcConfigurerAdapter学习总结
  4. CentOS7防火墙firewalld和iptable的设置和使用
  5. Statement和PreparedStatement深入学习总结
  6. CAP理论与分布式事务解决方案
  7. 关闭fedroa19开关机画面
  8. 使用SoapHeader对WebService进行身份验证
  9. Linux 2.6内核中新的锁机制--RCU [转]
  10. position:relative 与 position:absolute