JDK成长记10Thread的基本原理和

北京湿疹医院地图 http://news.39.net/bjzkhbzy/210114/8589988.html
文章配图文章配图

相信你经过集合篇的成长,已经对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秒会发起


转载请注明:http://www.aierlanlan.com/rzfs/1830.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了