为了账号安全,请及时绑定邮箱和手机立即绑定
3.2 Session的生命周期

这里我们谈谈 Session 的生命周期,和 Cookie 有所不同。首先 Session 保存在服务器端,为了获得更高的存取速度,服务器一般把Session放在内存里。Session 会在用户第一次访问服务器的时候自动创建。Session 生成后,只要用户继续访问,服务器就会更新 Session 的最后访问时间,并维护该 Session。用户每访问服务器一次,无论是否读写 Session,服务器都认为该用户的 Session “活跃”了一次。由于会有越来越多的用户访问服务器,因此 Session 也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的 Session 从内存删除。这个时间就是 Session 的超时时间。如果超过了超时时间没访问过服务器,Session 就自动失效了。

2. 生命周期

uni-app 框架除了支持 vue 组件生命周期之外,还新增了应用生命周期和页面生命周期。这些生命周期函数对应的语法,我们在前面小节都给大家详细的介绍过了,其中比较难以区分的是「页面生命周期函数」和「组件生命周期函数」。在日常项目开发过程中,这两者之间功能会有点重复,我们通常选择其中一个使用就可以了。但是要注意的是,应用生命周期函数仅在 page 页面有效,在单独封装的组件中无效。但是组件生命周期函数在 page 页面和单独封装的组件中都有效。来用代码实例验证一下,在组件里面添加下面的生命周期函数,我是在 components/login/login.vue 文件里面添加的。实例:beforeCreate(){ console.log('组件生命周期函数 beforeCreate:实例初始化');},onLoad() { console.log('页面生命周期函数 onLoad:页面初始化')},created(){ console.log('组件生命周期函数 created:实例创建完成');}添加完成后,我们点击工具栏–运行–运行到内置浏览器,控制台中会打印下面的信息。组件生命周期函数 beforeCreate:实例初始化组件生命周期函数 created:实例创建完成可以看到没有打印页面生命周期函数 onLoad。可以验证页面生命周期函数在单独封装的组件中无效。这一点我们在开发过程中一定要注意,如果页面生命周期函数没有执行,先要检查一下是不是在单独封装的组件中运行的。

2.2 生命周期函数

在生命周期中的每个阶段都会伴随着一个函数的触发,从而执行生命周期函数中的具体逻辑代码,这些函数就被称为生命周期函数。下面我们来看一下 uni-app 中都包括哪些生命周期函数。

2.1 生命周期分类

uni-app 生命周期包括应用生命周期和页面生命周期。应用生命周期:是控制应用全局的生命周期,监听应用初始化、启动、报错等状态。只在 App.vue 文件中有效,App.vue 文件是应用配置文件,用来配置 App 全局样式以及监听应用生命周期。页面生命周期:是控制单个页面的生命周期,监听页面渲染、加载、显示、下拉、滚动、分享等状态。

2.2 default生命周期

default 生命周期应该算是大多数开发者最为熟悉的生命周期,也是平时在开发过程中最常用的生命周期。 (clean,site 并不属于 default 生命周期)在 default 生命周期中,最常用的几个阶段包括:validate:验证阶段。验证项目构建过程中需要的信息的正确性;compil:编译阶段;test:测试阶段。使用测试框架对项目进行测试,打包过程中,非必要阶段,可以跳过执行。package:打包阶段。将编译好的文件打包成 jar 包,war 包或者 ear 包;verify:检查阶段。检查打包结果的有效性;install:本地部署阶段。将包部署到本地仓库,可以提供给本地开发过程中其他项目使用;deploy:远程仓库部署阶段。将最终的包复制到远程仓库,提供给使用该仓库的其他开发者使用。这里我们介绍的只是在 default 生命周期中最常用的,其实在这些阶段执行的过程中,还会有其他的阶段需要执行,但是并非很常用。另外,不出意外的情况下,在生命周期中,后执行的阶段要等先执行的阶段执行完再执行。我们试着执行 Maven 的打包命令:mvn package -DskipTests。执行完成之后,可以看到其所经过的生命周期。因此,当我们想要构建项目的时候,并不需要分别执行 package 阶段之前的阶段,而是 Maven 自动为我们执行。突然发现,原来构建项目是如此的简单,方便。

Maven 生命周期

我们今天带来的是 Maven 的另一个重要概念–生命周期。在学习了 Maven 的生命周期之后,在使用 Maven 的过程中,就能够够好的理解每一步操作的意义。

2. 生命周期详解

Maven 的生命周期并非只有一套,而是有三套,并且这三套生命周期之间是没有关系的。一套生命周期包含很多个不同的阶段,这些不同的阶段是有顺序的,有些阶段必须要在某个阶段完成之后,才能进行。Maven 的三套生命周期分别为:clean(清理),default(默认),site(站点)。接下来我们就一一介绍一下这三个生命周期。

2.3 site 生命周期

很多时候,我们不仅仅需要构建我们的项目,还需要生成项目文档或者站点。site 生命周期则是来帮助我们做这件事情的,它能够根据我们项目中 pom.xml 的信息,来生成一个友好的站点。跟其他的生命周期一样,site 生命周期也包含不止一个阶段:pre-site:准备阶段。在生成站点前所需要做的工作;site:生成站点阶段;post-site:结束阶段。生成站点结束后所需要做的工作;site-deploy:发布阶段。我们可以将上面生成的站点发布到对应服务器中。

2. 什么是生命周期

生命周期就是指一个对象生老病死的过程,针对 uni-app 来说,生命周期就是 uni-app 实例从创建、运行到销毁的过程。

3. 生命周期流程

我们来看一下官网给的 Vue 生命周期的图:从上面这幅图中,我们可以看到 vue 生命周期可以分为八个阶段,分别是:beforeCreate(创建前)created(创建后)beforeMount (载入前)mounted(载入后)beforeUpdate(更新前)updated(更新后)beforeDestroy(销毁前)destroyed(销毁后)

5. Gradle 构建的生命周期

前面我们说了 Task 的执行顺序,下面我们了解以下 Gradle 构建的生命周期。我们学习 Android 时候我们知道,一个应用(Application)、活动(Activity)、服务(Service)都是有生命周期。同样今天我们学习的 Gradle 的构建它也是有生命周期的。Gradle 构建的生命周期有三个阶段:初始阶段,配置阶段和运行阶段。

2.1 生命周期的各个流程

Android 系统为每个 Activity 设计了完备的生命周期,在各个不同的生命周期我们都可以做不同的工作,Activity 生命周期流程图如下:上图中的每一个矩形框代表一个生命周期方法,Activity 一共有 7 个生命周期。当然我们在实际开发中并不需要全部都实现,只需根据具体需求在合适的时机去实现相应的生命周期方法即可,这就要求开发者对每个生命周期回调的时机和意义比较了解,下面我们来解读一下每个生命周期的调用时机:onCreate():在 Activity 被创建的时候回调,也是 Activity 的第一个生命周期方法,在整个生命周期中只会执行一次。通常会在这里执行页面的初始化逻辑,大部分的 Activity 相关的代码都会在这里执行onStart():当 Activity 对用户可见的时候回调,注意此时可能还不能交互,可以用来统计页面曝光onResume():当 Activity 获取系统焦点的时候回调,此时已经可以和用户交互onPause():当 Activity 暂停的时候回调,此时用户已经不能交互,并且暂停执行正常业务代码。通常这时候会回调下一个或者上一个 Activity 的onResume()onStop():当 Activity 不可见的时候回调,此时结束曝光onRestart():在“Stop”之后,再次回到 Activity 时触发此方法onDestroy():此生命周期触发标志着 Activity 销毁,是最后一个生命周期,和onCreate()一样,只会调用一次,接着系统就会回收掉这部分资源这 7 个生命周期不是单纯的线性运动,从上图可以看出除了第一个和最后一个:onCreate()、onDestroy()之外,其他的都是可以反复循环的。

2. 各类生命周期函数的区别

应用生命周期函数比较好区分,是用来监听整个应用的。有一个很好的判断方法就是,写在 App.vue 文件中生命周期函数就是应用生命周期函数。页面生命周期函数和组件生命周期函数都是对一个页面中状态的监听,比较容易混淆。简单来说,应用生命周期函数仅在 page 页面有效,在单独封装的组件中无效。但是组件生命周期函数在 page 页面和单独封装的组件中都有效。

6. Java 线程的生命周期

每个事物都有其生命周期,也就是事物从出生开始到最终消亡这中间的整个过程。在其整个生命周期的历程中,会有不同阶段,每个阶段对应着一种状态,比如:人的一生会经历从婴幼儿、青少年、青壮年、中老年到最终死亡,离开这人世间,这是人一生的状态。同样的,线程作为一种事物,也有生命周期,在其生命周期中也存在着不同的状态,不同的状态之间还会有互相转换。Java 线程的声明周期会经历 6 中不同的状态变化,后续章节会有详细描述。从线程的创建到线程执行任务的完成,即 Java 线程的生命周期。

2.1 clean 生命周期

clean 生命周期包括:pre-clean: 清理前的准备工作;clean:清理上一次构建的结果;post-clean: 清理结束后需要完成的工作。一般情况下,Maven 的构建结果会生成在 target 目录下,我们执行 mvn clean 命令后,这个目录会被清空。从上图,我们可以看到,对应的 target 目录被清理干净了。

3.3 线程生命周期

和 Activity 一样,Thread 在执行过程中也有自己的生命周期,一共有 5 种状态:**New:**刚创建好,还未执行**Runnable:**已经调用了start(),等待 CPU 分配时间片**Running:**正在运行**Blocked:**由于某些原因(等待、睡眠、CPU暂时回收资源等)线程进入阻塞**Dead:**线程任务执行结束,或者主动关闭各个生命周期的切换如下图:

5. 组件生命周期函数与页面生命周期函数的联合使用

大家可能看到这里还有一点云里雾里,我们再在调用 Login 组件的 index 页面中添加页面生命周期函数,来看看这些生命周期函数是怎样合作的。

2.1. 生命周期的概念

​ 生命周期,通俗的理解就是从出生到死亡的过程,那么对于对象而言,就是实例在 Spring 容器中创建到销毁的过程。

1. 什么是生命周期

其实生命周期这个概念并不是 Maven 首创的,因为即使不用 Maven,这些事情也是需要我们去做的。想象一下在没有 Maven 的时候,我们开发完一个项目之后,一般是直接使用 Java 的相关命令进行编译,打包等等工作。但是这些工作无聊而且繁琐,基本上充斥在开发者每天日常的工作中,无论是开发新功能,还是修改一个 Bug,都需要重复以上操作。当然有聪明的开发者,也会将这些每天重复的事情做成脚本来执行。那么问题又来了,不同公司的不同项目之间或多或少会存在些许差异,这种时候,可能就需要开发者针对这些差异来定制一些步骤,或者脚本。也就是说,每当我们开始开发一个新项目的时候,或者换到另一个项目组的时候,我们构建项目的步骤或者方式都可能会发生变化。Maven 的出现,可以说是很大程度上缓解了这种问题的发生。通过吸取很多项目的经验,Maven 定义了一套完整而且统一的生命周期模型。使用这个模型,我们将构建的细节交给 Maven,只需要理解对应生命周期的含义即可完成构建。就好像,人到了青少年的时候,就要去上学,到了青年的时候,就要出来工作类似,我们不需要知道上学或者工作中具体的事情,只需要知道,到了这个阶段,能够做这个事情就可以了。

4.2. activated 和 deactivated 生命周期

activated 和 deactivated 和我们之前学习的生命周期函数一样,也是组件的生命周期函数。不过, activated 和 deactivated 只在 <keep-alive> 内的所有嵌套组件中触发。activated:进入组件时触发。deactivated:退出组件时触发。示例代码:683代码解释:JS 代码中,我们定义了组件 ComponentA、ComponentB,并分别定义了他们的 activated 和 deactivated 事件函数。HTML 代码第 2-3 行,我们使用 keep-alive 包裹动态组件 component,将当前需要展示的组件名通过变量 currentView 绑定到 component 的 is 属性上。HTML 代码第 5-6 行,我们定义了两个按钮,通过点击按钮切换 currentView 的值。当我们切换组件显示时,可以看到这样的打印信息:1. ComponentA -> ComponentB 会打印出:组件A 被移除、组件B 被添加2. ComponentB -> ComponentA 会打印出:组件B 被移除、组件A 被添加TIPS: 注意,activated 和 deactivated 这两个生命周期函数一定是要在使用了 keep-alive 组件后才会有的,否则不存在。

4. 生命周期执行流程

ChannelHandler 的一些特殊回调方法,这些回调方法的执行是有顺序的,而这个执行顺序可以称为 ChannelHandler 的生命周期。

3. Session 缓存

Hibernate 提供有一级和二级缓存,一级缓存也叫 Session 缓存,二级缓存也叫 SessionFactory 缓存。前面课程中和大家聊过,Session 的使用原则是,需要时创建,用完后关闭,其作用域一般为方法级别。一级缓存的生命周期和 Session 是一致的,所以,一级缓存中所存储的数据其生命周期也不长,其实际意义就论情况来看了。SessionFactory 在前面也讨论过,SessionFactory 是应用程序级别的生命周期,所以与其关联的缓存中所保存的数据也可以长时间存在。默认情况下,Hibernate 的一级缓存是可以直接使用的,二级缓存是没有打开的。需要根据实际情况进行选择。

4. 组件生命周期函数应用

我们在前面小节创建的 Login 组件中验证组件生命周期函数的应用, Login 组件是我们前面小节实现的一个登录弹窗组件。

2.2 生命周期流程概要

简单地来说,一个 Bean 的生命周期分为四个阶段:(1) 实例化(Instantiation)(2) 属性设置(populate)(3) 初始化(Initialization)(4) 销毁(Destruction)流程图如下:Spring 中 bean 的实例化过程:Bean 实例生命周期的执行过程如下:Spring 对 bean 进行实例化,默认 bean 是单例;Spring 对 bean 进行依赖注入;如果 bean 实现了 BeanNameAware 接口,Spring 将 bean 的 id 传给 setBeanName() 方法;如果 bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory 方法,将 BeanFactory 实例传进来;如果 bean 实现了 ApplicationContextAware 接口,它的 setApplicationContext() 方法将被调用,将应用上下文的引用传入到 bean 中;如果 bean 实现了 BeanPostProcessor 接口,它的 postProcessBeforeInitialization 方法将被调用;如果 bean 实现了 InitializingBean 接口,Spring 将调用它的 afterPropertiesSet 接口方法,类似地如果 bean 使用了 init-method 属性声明了初始化方法,该方法也会被调用;如果 bean 实现了 BeanPostProcessor 接口,它的 postProcessAfterInitialization 接口方法将被调用;此时 bean 已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;若 bean 实现了 DisposableBean 接口,Spring 将调用它的 distroy() 接口方法。同样地,如果 bean 使用了 destroy-method 属性声明了销毁方法,则该方法被调用;

4. 线程的状态和生命周期

java.lang.Thread.Starte 枚举类中定义了 6 种不同的线程状态:NEW:新建状态,尚未启动的线程处于此状态;RUNNABLE:可运行状态,Java 虚拟机中执行的线程处于此状态;BLOCK:阻塞状态,等待监视器锁定而被阻塞的线程处于此状态;WAITING:等待状态,无限期等待另一线程执行特定操作的线程处于此状态;TIME_WAITING:定时等待状态,在指定等待时间内等待另一线程执行操作的线程处于此状态;TERMINATED:结束状态,已退出的线程处于此状态。值得注意的是,一个线程在给定的时间点只能处于一种状态。这些状态是不反映任何操作系统线程状态的虚拟机状态。线程的生命周期,实际上就是上述 6 个线程状态的转换过程。下图展示了一个完整的生命周期:

2.2 生命周期常见问题及误区

**另外要特别注意的,也是面试中非常容易被问到的一个经典问题:**从 Activity A 启动到 Activity B,再从 B 退回到 A,所经历的生命周期方法依次是哪几个?大家可以先根据生命周期流转图及各生命周期的定义自行思考一下,分割线后给出答案。我们来分析一下这个问题,首先是 Activity A 的启动:A onCreate -> A onStart() -> A onResume()到这里 A 就启动完毕了,接下来启动 Activity B,此时系统会将焦点移动到 B 上,故 A 的 onPause() 会被调用,接着创建 Activity B,那么流程是这样的:A onPause() -> B onCreate() -> B onStart() -> B onResume()此时 B 已经启动完毕,大家注意到 A 的onStop()自始至终还未执行,我们再次回忆一下onStop()的定义:“当 Activity 不可见的时候回调”。所以此时要分两种情况,如果 Activity B 是全屏的类型,那么在 B 启动之后系统会回调 Activity A 的 onStop();但是前面提到过,Activity可以是浮窗类型,此时 A 的onStop()则不会被回调,这是一个关键点,大家一定要记住!!所以从 Activity A 跳转 Activity B 的生命周期触发顺序如下:A onCreate -> A onStart() -> A onResume() -> 跳转 B -> A onPause() -> B onCreate() -> B onStart() -> B onResume() -> if (B is full screen) { A onStop() }此时如果从 B 在返回到 A 的话,按照以上原理不难理解:B onPause() -> A onRestart() -> A onStart() -> A onResume() -> B onStop() -> B onDestroy()由于从 B 返回 A 需要销毁 B,所以此时不论 A 是否是全屏类型都会在 A 恢复之后依次调用 B 的onStop()和onDestroy()。这个是面试必考题,大家务必掌握!

3.2 页面生命周期

函数名说明支持平台 onLoad 页面加载时触发,一个页面只会调用一次。可以传递参数,参数说明查看示例 3.2.1 所有 onShow 页面显示时触发,每次打开页面都会调用一次所有 onReady 页面初次渲染完成后触发,一个页面只会调用一次所有 onHide 页面隐藏时触发,每次隐藏页面都会被触发所有 onUnload 页面卸载时触发所有 onResize 页面每次窗口尺寸变化时会被触发,App、微信小程序 onPullDownRefresh 用户下拉页面时触发,一般用于页面下拉刷新,查看实例 3.2.2 所有 onReachBottom 页面上拉滚动触底时触发所有 onTabItemTap 点击底部 tab 栏时触发,参数为 Object,参数说明查看实例 3.2.3 微信小程序、百度小程序、H5、ApponShareAppMessage 点击右上角分享时触发微信小程序、百度小程序、字节跳动小程序、支付宝小程序 onPageScroll 页面滚动时触发,只监听页面垂直滚动所有 onNavigationBarButtonTap 监听原生标题栏按钮点击事件,参数说明查看实例 3.2.4App、H5onBackPress 页面返回时触发,查看实例 3.2.5App、H5onNavigationBarSearchInputChanged 监听原生标题栏搜索输入框输入内容变化事件 App、H5onNavigationBarSearchInputConfirmed 监听原生标题栏搜索输入框搜索事件 App、H5onNavigationBarSearchInputClicked 监听原生标题栏搜索输入框点击事件 App、H53.2.1 onLoad 参数说明页面生命周期函数 onLoad,是页面最先执行的生命周期函数,如果从上个页面跳转到本页面,可以通过参数 option 传递上个页面的数据。我们来看一下实例,比如要从首页(index.vue)跳转到个人中心页面(me.vue)。实例://index.vue//跳转语句,并在跳转链接上面加上要传递的数据uni.reLaunch({ url: 'test?name=我是首页的数据'});//me.vueexport default { //options参数就是上个页面传递过来的数据 onLoad: function (options) { console.log(options.name); }}//打印出来的结果我是首页的数据3.2.2 onPullDownRefresh 函数用于监听该页面用户下拉页面的动作。普通页面下拉不会触发 onPullDownRefresh 函数,要先在 pages.json 里面,找到当前页面的 pages 节点,并在 style 选项中将 enablePullDownRefresh 设置为 true,下拉页面才可以触发 onPullDownRefresh 函数。下面来看一下实例,比如我们想开启首页(index.vue)的下拉动作。实例://pages.json{ "path": "pages/index/index.vue", "style": { "enablePullDownRefresh": true }}调用完成 onPullDownRefresh 函数后,用 stopPullDownRefresh 函数可以停止当前页面的下拉状态。实例:export default{ onPullDownRefresh(){ console.log('用户下拉页面时触发') uni.stopPullDownRefresh() }}3.2.3 onTabItemTap 参数说明属性类型说明 indexString 被点击 tabItem 的序号,从 0 开始 pagePathString 被点击 tabItem 的页面路径 textString 被点击 tabItem 的按钮文字实例:export default { onTabItemTap(options) { console.log('被点击tabItem的序号index:' + options.index) console.log('被点击tabItem的页面路径pagePath:' + options.pagePath) console.log('被点击tabItem的按钮文字text:' + options.text) }}注意以下几点:onTabItemTap 常用于点击当前 tabitem,滚动或刷新当前页面。如果是点击不同的 tabitem,一定会触发页面切换。如果想在 App 端实现点击某个 tabitem 不跳转页面,不能使用 onTabItemTap,可以使用 plus.nativeObj.view 放一个区块盖住原先的 tabitem,并拦截点击事件。在 App 端,从 HBuilderX 1.9 的自定义组件编译模式才开始支持 onTabItemTap。3.2.4 onNavigationBarButtonTap 参数说明属性类型说明 indexNumber 原生标题栏按钮数组的下标实例:export default { onNavigationBarButtonTap(options) { console.log('index:' + options.index) }}3.2.5 onBackPress 参数说明返回结果的格式是这样的:event = {from:backbutton、 navigateBack}。其中 backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack 表示来源是 uni.navigateBack。属性类型说明 fromString 触发返回行为的来源:‘backbutton’—— 左上角导航栏按钮及安卓返回键;‘navigateBack’——uni.navigateBack () 方法实例:export default { onBackPress(options) { console.log('from:' + options.from) }}

2. 操作系统线程的生命周期

定义:当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建 (New)、就绪(Runnable)、运行(Running)、阻塞 (Blocked),和死亡 (Dead) 5 种状态。从线程的新建 (New) 到死亡 (Dead),就是线程的整个生命周期。下面我们分别对 5 种不同的状态进行概念解析。新建 (New):操作系统在进程中新建一条线程,此时线程是初始化状态。就绪 (Runnable):就绪状态,可以理解为随时待命状态,一切已准备就绪,随时等待运行命令。运行 (Running):CPU 进行核心调度,对已就绪状态的线程进行任务分配,接到调度命令,进入线程运行状态。阻塞 (Blocked):线程锁导致的线程阻塞状态。共享内存区域的共享文件,当有两个或两个以上的线程进行非读操作时,只允许一个线程进行操作,其他线程在第一个线程未释放锁之前不可进入操作,此时进入的一个线程是运行状态,其他线程为阻塞状态。死亡 (Dead):线程工作结束,被操作系统回收。

2.1 延迟加载

延迟加载是 Hibernate 提供的一种性能优化方案,但是,使用时需要注意,必须保持在 Session 生命周期之内。Hibernate 中的延迟加载有 2 种情形,如 load()方法。直接调用 load()方法只会产生一个代理对象,只有当访问属性的 get()方法时,才会访问数据。one-to-many、many-to-one、many-to-many 中也可以设置延迟加载,只有访问与当前查询相关联的关系表中的数据时,才会进行数据加载。因为 Session 生命周期较短,如果要跨组件使用延迟加载功能, 则需保持 Session 生命周期与请求过程相同。WEB 项目开发中,Hibernate 提供有 OpenSessionInViewFilter 过滤器,用来保证请求开始和响应结束的时候,使用同一个 Session。请求开始创建 Session,响应结束关闭 Session。使用时,这里面会有 1 个坑:不能使用重定向,因为重定向上本质上是两次请求。

3. Java 的线程的生命周期及状态

定义: 在 Java 线程的生命周期中,它要经过新建(New),运行(Running),阻塞(Blocked),等待(Waiting),超时等待(Timed_Waiting)和终止状态(Terminal)6 种状态。从线程的新建(New)到终止状态(Terminal),就是线程的整个生命周期。Tips :与操作系统相比, Java 线程是否少了 “就绪” 状态 ?其实 Java 线程依然有就绪状态,只不过 Java 线程将 “就绪(Runnable)" 和 “运行(Running)” 两种状态统一归结为 “运行(Running)” 状态。我们来看下 Java 线程的 6 种状态的概念。新建 (New):实现 Runnable 接口或者继承 Thead 类可以得到一个线程类,new 一个实例出来,线程就进入了初始状态。运行 (Running):线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一方式。阻塞 (Blocked):阻塞状态是线程在进入 synchronized 关键字修饰的方法或者代码块时,由于其他线程正在执行,不能够进入方法或者代码块而被阻塞的一种状态。等待 (Waiting):执行 wait () 方法后线程进入等待状态,如果没有显示的 notify () 方法或者 notifyAll () 方法唤醒,该线程会一直处于等待状态。超时等待 (Timed_Waiting):执行 sleep(Long time)方法后,线程进入超时等待状态,时间一到,自动唤醒线程。终止状态 (Terminal):当线程的 run () 方法完成时,或者主线程的 main () 方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。

首页上一页1234567下一页尾页
直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号