线程的生命周期和控制
一、线程的生命周期
进程与线程一样,都具有一定的生命周期,线程的生命周期包括四个状态:创建状态、就绪状态、阻塞状态、死亡状态。
1.创建状态
1)是指使用new实例化一个线程对象,但该线程对象还未使用start()方法启动线程这个阶段,该阶段只在内存的堆中为该对象的实例变量分配了内存空间,但线程还无法参与抢夺cpu的使用权;
2)创建完毕线程对象后,启动该线程对象的是start()方法,而不是run()方法。
2.就绪状态
1)是指一个线程对象使用start()方法后到运行完run()方法的这个阶段,线程一旦就进入就绪阶段,java虚拟机为该线程创建方法的调用栈和计数器等;
2)在某一单位时间(时间片)内,cpu只能运行一个线程,一但一个线程拥有了cpu的使用权,则该线程也可称为正在运行状态;
3)凡是处于就绪状态的线程都被视为活动的,可以使用isalive()方法测试线程是否处于就绪状态,使用activecount()查询当前线程所在线程池的活动线程数;
4)处于就绪状态的线程并不是运行状态,在以前的计算机很多都是单处理器的,要在同一时刻运行所有处于就绪状态的线程是不可能的,java通过一些调度算法来保证这些线程共享使用处理器(如时间片轮转算法、独占算法等)。
3.阻塞状态:
1)阻塞状态包含四种状态(睡眠状态、阻塞状态、挂起状态、等待状态),一般来说,阻塞状态和就绪状态可以相互切换的;
2)使用sleep()方法可以线程进入睡眠状态,让其他进程得到运行机会,但是用sleep方法必须捕获interruptedexecption异常;
3)使用suspend方法可以挂起线程(jdk1.2后已过时)、使用wait方法使线程进入等待状态(后面有一随笔会专门写)、使用i/o中断让线程进入阻塞状态。
4.死亡状态:
1)一旦线程运行完run方法,线程即进入死亡状态,java虚拟机会销毁处于死亡状态的线程对象所占用的系统资源;
2)线程执行时遇到一个未捕获的异常,线程会被终止并进入死亡状态;调用stop方法也可以让线程进入死亡状态,但是容易造成死锁,已弃用。
5.线程生命周期如下图:
二、下面是sleep方法使线程进入睡眠状态的案例
/**
* @author: princesshug
* @date: 2019/4/12, 9:20
* @blog: https://www.cnblogs.com/hellobigtable/
*/
public class sleepdemo implements runnable{
@override
public void run() {
long l;
for (int i=1;i<6;i++){
l = system.currenttimemillis();
try {
thread.currentthread().sleep(5000);
} catch (interruptedexception e) {
e.printstacktrace();
}
l = (system.currenttimemillis() - l);
system.out.println(thread.currentthread().getname() + "线程执行了" + i + "次,耗时" + l + "毫秒。");
}
}
}
public class sleepdriver {
public static void main(string[] args) {
sleepdemo sd = new sleepdemo();
for (int i=0;i<50;i++){
new thread(sd,i + "#").start();
}
}
}
下面是部分运行结果截图:
可以看到如果同时启动的线程越多,会导致每个线程的耗时越长。
上一篇: 借书证信息管理系统,C语言实现
下一篇: 关于腊八节的传统食物
推荐阅读
-
Windows下的PHP安装文件线程安全和非线程安全的区别
-
DB2和 Oracle的并发控制(锁)的比较_Oracle应用_脚本之家
-
HTML5多线程JavaScript解决方案Web Worker-专用Worker和共享Worker的详细代码介绍
-
Java中的增强for循环和break continue的使用 以及流程控制训练
-
Laravel框架路由和控制器的绑定操作方法
-
CSS控制前台样式在360和chrome的兼容问题,跪求高手帮忙,在线等,,,,,,,_html/css_WEB-ITnose
-
Ruby 多线程的潜力和弱点分析
-
原生Javascript(语言基础和流程控制语句)—1_Sander_2020的博客—CSDN博客
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)
-
iOS实现屏幕亮度和闪光灯控制的实例代码