多线程1(进程、[创建]线程与生命周期)
一、进程与线程
什么是进程?
我们先说说什么是程序?
程序(Program)是为实现特定目标或解决特定问题而用计算机语言(比如Java、C等)编写的命令序列的集合。
进程(process)就是指一个程序的一次执行过程。(也就是说当一个程序进入内存执行时就变成了一个进程。)
例如下图的进程 :👇
什么是线程?
线程(thread)又称为轻量级进程(但它不是进程,不能与进程混为一谈),线程是一个程序中实现单一功能的一个指令序列,是一个程序的单个执行流,存在于进程中,是一个进程的一部分。
进程与线程的关系:
- 一个进程可以包含多个线程,而一个线程必须在一个进程之内运行;同一个进程中的多个线程(以及不同进程之间的线程)之间采用抢占式独立运行。
我们来说一下何为抢占式独立运行:
假如有一群人在一个大房子里聚餐,这群人分为了好几拨人,有李家的、王家的、张家的… ,每拨人好比一个程序,当他们动起来时就变成了不同的进程,每拨人中的每个人都是一个线程。突然房子起火,为了生存,任务就是跑出这个房子,但这个大房子只有一个门,且这个门只能一次出去一个人,所以动起来的每拨人中的每个人都抢着要出门(谁也不让着谁),谁抢到了谁就先出去,这就是抢占式独立运行。(他们抢的门就是CPU的执行调度权。)
当上面李家还有一个人没有出来,则该进程就没有结束,一旦李家的人都出来,则意味着李家的每个人都出来了,这就是:
- 进程结束,则线程跟着结束,如果一个进程没有可执行的线程,进程也结束。
- 线程有独立的执行堆栈、程序计数器和局部变量;但是没有独立的存储空间,而是和所属进程中的其它线程共享存储空间;
- 操作系统将进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的速度。
现在你应该懂了当你的电脑或手机上打开的软件过多时,会变得卡了吧!!!
那如何创建线程呢?
方式一:
继承
java.lang.Thread
类,重写run()
方法:
class 类名 extends Thread{//属性@Overridepublic void run(){//线程需要执行的核心代码}//其他方法
}
示例:
package muti;public class Test {public static void main(String[] args) {CountThread countThread =new CountThread();//创建线程对象countThread.start();//启动线程,进入就绪状态}
}class CountThread extends Thread{@Overridepublic void run(){for (int i=0; i<100 ; i++){System.out.println("计数" + i);try {//使当前正在执行的线程休眠Thread.sleep(1000);//也可以直接写sleep(1000);因为该类继承了Thread类} catch (InterruptedException e) {e.printStackTrace();}}}
}
方式二:
实现
java.lang.Runnable
接口,实现run()
抽象方法
class 类名 implements Runnable{//属性@Overridepublic void run(){//线程需要执行的核心代码}//其他方法
}
示例:
package muti;import java.text.SimpleDateFormat;
import java.util.Date;public class Test {public static void main(String[] args) {TimeThread timeThread = new TimeThread();Thread thread = new Thread(timeThread);//创建线程对象thread.start();//启动线程,进入就绪状态}
}class TimeThread implements Runnable{String threadName = "时间线程";@Overridepublic void run() {int i=0;while (i<100){SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");String currentTime = simpleDateFormat.format(new Date());System.out.println(threadName+",当前时间:"+currentTime);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}结果:
时间线程,当前时间:12:25:00
时间线程,当前时间:12:25:01
时间线程,当前时间:12:25:02
时间线程,当前时间:12:25:03
时间线程,当前时间:12:25:04
......
线程的生命周期
Java中,线程有5种不同的状态,分别是:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。
注意:线程实例调用start()
方法并不意味着该线程立即进入了运行状态,而是就绪。
- 新建状态(New):新创建了一个线程对象。
- 就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的
start()
方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 - 运行状态(Running):就绪状态的线程获取了CPU使用权,执行程序代码。
- 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
- 等待阻塞:运行的线程执行
wait()
方法,JVM会把该线程放入等待池中。(wait会释放持有的锁) - 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
- 其他阻塞:运行的线程执行
sleep()
或join()
方法,或者发出了I/O
处理完毕时,线程重新转入就绪状态。(注意:sleep是不会释放持有的锁)
- 等待阻塞:运行的线程执行
- 死亡状态(Dead):线程执行完了或者因异常退出了
run()
方法,该线程结束生命周期。
相关文章:

网络操作系统第四章
1. 磁盘的数据结构包括哪些内容? 答:分区,卷,磁盘分区,主分区,扩展分区,逻辑分区,逻辑驱动器,引导分区。 2. 什么是基本磁盘和动态磁盘? (…

广播风暴系列专题(一)广播风暴:发现-端口
近日防火墙经常地检测到"svchost UDP/连入192.168.1.255/137 192.168.1.66/137 1055656/1065732 UDP_WAIT 过滤 8:48:31 C:\WINDOWS\system32\svchost.exe";"services UDP/连出 192.168.1.21/137 192.168.1.255/137 920736/913476 UDP_WAIT 过滤 11:46:3…

显示一个顶层的提示信息
vb里常作,大概的思路就是显示一个顶层的窗体,提示暂时不要动。c#里更简单了MsgDlg msgnewMsgDlg(); msg.TopMosttrue; msg.Show(); System.Windows.Forms.Application.DoEvents();

ArcGIS Engine开发-TOCControl中实现图层的拖放
TOCControl非常好,不用写一行代码就可以将整个地图的图层信息况显示出来;TOCControl也非常坏,提供的接口非常少,我认为有用的只有三个:HitTest,SetBuddyControl,Update,而且Update方法一执行,整…

多线程2(常用的方法:join、interrupt、currentThread、isAlive、setDaemon...)
常用的方法: 1、join()方法:join()方法:执行该方法的线程进入阻塞状态,直到调用该方法的线程结束后再由阻塞状态转为就绪状态。 示例: package venus;import java.util.Date;public class Test {public static void m…
Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了…那么本篇主要总结关于Oralce视图、序列、事务的一些内容… 在数据库中,我们可以把各种的SQL语句分为四大类… (1)DML(数据操纵语言ÿ…

物联网应用介绍
•物联网的研究背景(概念 | 本质 | 特征 | 发展现状)物联网是新一代信息技术的高度集成和综合运用,已成为全球新一轮科技革命与产业变革的核心驱动和经济社会绿色、智能、可持续发展的关键基础与重要引擎。国家十三五规划纲要明确提出“积极推…

Oracle使用手册(三)---存储过程与触发器
--存储过程/**//*--1.过程的语法结构--参见:http://newland.cnblogs.com/archive/2006/04/05/367531.html--2.执行存储过程begin 存储过程名;end;--创建好的存储过程可以被任何程序调用*/--3.带参数的存储过程/**//* 参数类型 在PL/SQL过程中,可以有3种类型的…

数据结构之【线性表】(顺序表、链表的基本操作实现)
概念线性表:是N个数据元素的有限序列。 顺序表:用一组地址连续的存储单元依次存储【线性表 】的数据元素。(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储【线性表…

基于android的天气预报的设计与实现
目录 应用开发技术及开发平台介绍应用需求分析应用功能设计及其描述应用UI展示①开发技术: 本系统是采用面向对象的软件开发方法,基于Android studio开发平台,以Android作为本系统的开发语言实现音乐播放器预定的需求功能。 ②平台介绍 硬件平…

敏捷开发有感!
http://sd.csdn.net/n/20060913/94713.html1.我们最优先要做的是通过尽早的,持续的交付有价值的软件来使客户满意。有一篇文章分析了对于公司构建高质量产品方面有帮助的软件开发实践,其中一个实践表明尽早的交付具有部分功能的系统和系统质量之间具有很…

ng 表单提交验证
http://www.runoob.com/try/try.php?filenametry_ng_validate 转载于:https://www.cnblogs.com/alvin553819/p/7127226.html

Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装
上个月看到Infragistics NetAdvantage 2006 Volume 2 CLR 2.0(新特性)新鲜出炉,就一直想安装试用。昨天qq上得知已经有人在使用了,赶紧google一个down下来。经过漫长下载等待,满怀希望安装,哪想到快完成的时候居然报错,…

数据结构之【栈】的基本操作C语言实现
引题: 很多人都把【栈】描述成【弹匣】,但我总感觉有点不恰当,因为弹匣从上端【装弹】之后,子弹总是在匣的上层;而元素【进栈】之后,总在栈的下面。 我觉得还是描述成【从下往上向书箱里一层…

编码小记(未整理-持续更新)
----------------基本概念-------------------------------一.位: 计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。 二.字节 字节(Byte)是一…

使用locate 的正则查询 查找所有main.c
locate支持正则查询的功能, 只需输入locate -r 正则表达式 即可。 现在我想查找所有main.c怎么做? 打开终端,输入shell: locate -r main.c$ PS:$表示结束字符串结束。转载于:https://www.cnblogs.com/the-one/p…

My Favorites
AJAX "Atlas" Control Toolkit HomePage "Atlas" Client Class Library "Atlas" Server Class Library ASP.NET AJAX Roadmap http://www.ajaxian.com 被成为AJAX第一站 . http://www.ajaxmatters.com/ 不仅有讨论XMLHttpRequest 的文…

数据库事务初探
使用事务级别要慎重: 因为事务级别越高,数量越多、限制性更强的锁就会被运用到数据库记录或者表中。同时,更多的锁被运用到数据库和它们的覆盖面越宽,任意两个事务冲突的可能性就越大。 如果有一个冲突(例如两个事务试图获取同一个…

数据结构之【队列】的基本操作C语言实现
直接上图: 循环队列的声明: 0、循环队列的声明 循环队列的基本操作: 1、InitQueue(&Q)(构造一个空队列) 2、DestroyQueue(&Q)(销毁队列Q) 3、ClearQueue(&Q)(清空队列Q&…

在python3环境安装builtwith模块
1、安装命令: pip install builtwith 如果在命令行提示如下错误: Fatal error in launcher: Unable to create process using " 使用如下命令: python3 -m pip install builtwith 2、导入模块会出现错误提示: 原因࿱…

kettle组件-输出
1:删除连接数据库:新建连接数据库,或者应用转换中已经定义好的数据库。目标模式:指什么现在还不明确,集群模式?子服务器模式?--要写入数据的表的Schema名称。允许表名中包含“.”是很重要的。目…

NGOSS的一点简单概念
NGOSS(Next Generation Operational Support Systems)是由TMF(Tele Management Forum)提出的,他用于电信领域,是构建下一代OSS/BSS系统的框架。TMF提供了技术中立构架(TNA)作为NGOSS…

Windows Mobile 5.0 设备的目录变化
自定义铃声的默认两个存放位置:1. Application Data\Sounds (不是Storage下的Application Data了)。2. 外存储设备的根目录。

第二周期的第一次站立会议
今天:对这一阶段的任务进行了分配,我就自己的任务内容搜集了一些资料,尝试了编程。明天:继续进行编程。遇到的问题:编程方面有些许的困难。转载于:https://www.cnblogs.com/guantianhuan/p/10051436.html

常见的函数式编程模型
1.闭包(Closure) 闭包的概念 可以保留局部变量不被释放的代码块,被称为一个闭包。 闭包的特点:函数嵌套函数、内部函数可以引用外部函数的参数和变量、参数和变量不会被垃圾回收机制收回 // 创建一个闭包 function makeCounter() …

Ubuntu下安装和配置Redis
找到 /ect/redis/redis.conf 文件修改如下:注释掉 127.0.0.1 ,如果不需要远程连接redis则不需要这个操作。使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。默认情况下,Redis服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。执行sudo apt-get install redis-server 安装命令。查看 redis 是否启动,重新打开一个窗口。停止/启动/重启redis。

自学笔记——1.Pyhton保留关键字
Python保留关键字python保留的关键字如下python保留的关键字如下 and del from None True as elif global nonlocal try assert else if not while break except import or with class False in pass yield continue finally is raise def for lambda…

人的一生有三件事不能等
人的一生有三件事不能等人的一生有三件事不能等 第一是“贫穷” 贫穷不能等,因为一但时间久了,你将习惯贫穷,到时不但无法突破自我,甚至会抹杀了自己的梦想,而庸庸碌碌的过一辈子。。。。。。 第二是“梦想” 梦想不能…

安装部署中的数据库打包和快捷方式启动浏览器
前一段时间,因为工作的需要,学习了一些.net的部署。在打包的过程中遇到了几个问题:<?XML:NAMESPACE PREFIX O />1、 数据库脚本打包,如何修改Web.config文件中的数据联接2、 数据库脚本中的方法和视图打包时要注意的问题…

Windows下安装和配置Redis
下载版本Redis-x64-5.0.14.1.zip。(可能需要开代理)