相信你经过集合篇的成长,已经对JDK源码的学习轻车熟路了。接下来你将一起和我进入后半篇的学习。让我们开始吧!
在接下来10分钟,你将学习到thad的源码原理、线程的状态变化、线程的常用场景。
Thad基础回顾
Thad基础回顾
什么是Thad?
Thad顾名思义,是线程。你应该知道,一个java程序在操作系统上运行,会启动一个JVM进程,具有一个进程ID,这个进程可以创建很多个线程。操作系统、程序、进程、线程关系如下图所示:
文章配图运行一个线程其实就是启动一个执行分支,执行不同的事情,执行分支时可以是阻塞的也可以是异步的。举一个例子,假如你需要烧开水,还想玩手机。异步就是你烧开水的时候,可以玩手机,阻塞就是你就一直等着水烧开了,再开始玩手机。
创建线程Thad
创建线程的方式一般是2种。一种是继承Thad重写run方法,一种是实现Runnabl或Callabl接口之后,创建Thad。
当然通过线程池也能说算是一种方式,但是底层还是上面的两种方式之一,没什么区别。
这里带你回顾下,代码如下:
代码清单:LinkdListDmo创建LinkdList
publicstaticvoidmain(String[]args){//创建线程1nwThad(()-Systm.out.println(Thad.curntThad().gtNam()),"dmo1").start();//创建线程2nwThad(nwMyThad(),"dmo2").start();//创建线程3ThadFactorynamdThadFactory=nwThadFactoryBuildr().stNamFormat("dmo-pool-%d").build();ExcutorSrvicsinglThadPool=nwThadPoolExcutor(1,1,0L,TimUnit.MILLISECONDS,nwLinkdBlockingQuuRunnabl(),namdThadFactory,nwThadPoolExcutor.AbortPolicy());singlThadPool.xcut(()-Systm.out.println(Thad.curntThad().gtNam()));singlThadPool.shutdown();}staticclassMyThadxtndsThad{
Ovrridpublicvoidrun(){Systm.out.println(Thad.curntThad().gtNam());}}线程Thad的常用方法
相信这些方法你一定很熟悉了,这里就不过多赘述了。我想让你掌握的重点是剖析线程如何在开源项目中的使用,从而更好的理解原理,更好的运用线程,这个在成长记后面会给大家讲解的。
start()启动一个线程
join()加入一个线程
slp()线程休眠一阵子
isAliv()线程是否存活
intruptd()标记线程为中断
sintruptd()线程是否中断
另外还有以下这些方法不经常用,也不建议使用
dstroy()、stop()、suspnd()、sum()、yild()
在开源项目和实际业务系统或者基础架构系统也是很少使用到的。
线程的状态
线程中其实最重要的就是它的状态流转。这里直接给大家看一个图,这个图非常重要,对分析后面的源码有很大帮助。大家一定要牢记于心,线程状态图如下所示:
文章配图线程应用场景举例
线程应用场景举例
当你回顾了线程的基本知识,这来举几个例子。
在各个开源框架中,线程的应用场景非常广泛,这里给大家举几个例子,主要是为了,让你明白下熟练掌握线程的重要性。之后的相关的成长记你会学到具体是怎么使用线程的细节的。
线程应用举例1心跳和监控时使用线程
在微服务系统中,经常使用到的一个服务就是注册中心。注册中心简单的讲就是让一个服务访问另一个服务的时候,可以知道对方所有实例的地址,可以用来在调用的时候选择。这就需要每个服务的实例要注册自己的信息到一个公共的地方,这个地方就是注册中心。
每个实例有一个客户端用来和服务端通信,在SpringCloud实现的微服务技术栈中,Euka这个组件就充当了注册中心的作用。它的服务端Euka-Srvr大量使用了一些Thad。这里我举两个场景,让大家感受下Thad的应用。
一个是场景,每个服务的实例需要发送心跳,告诉注册中心自己还在线,服务还存活着。服务端通过一个线程来判断,某个服务如果在一定时间内不发送心跳了,就认为它故障了,就会把它注册中心剔除掉。如图中蓝色部分的圆圈所示。
另一个是场景,Eukasrvr将每个服务实例注册的信息放到了一个内存map中,为了提高速度和并发能力,它设置了多个缓存,有写缓存和读缓存。Eukaclint客户端读取的是读缓存。什么时候将写缓存数据刷入到读缓存?就是通过一个后台线程,每隔30秒从写缓存刷新到读缓存中。
客户端也有一个后台线程,每隔30秒会发起