一、java多线程编程

在java中,如果要实现多线程,就必须依附线程主体类,而java.lang.Thread是java中负责多线程操作类,只需继承Thread类,就能成为线程主体类,为满足一些特殊要求,也能够通过实现Runnable接口或者Callable接口来实现定义。

具体形式如下:

1.继承Thread类,重写run办法(无返回值)

2.实现Runnable接口,重写run办法(无返回值)

3.实现Callable接口,重写call办法(有返回值且能够抛出异样) 重点:留神多线程操作数据的一致性,乐观锁和乐观锁的应用。

转化线程池的应用:

配置参数:

corePoolSize:线程池保护线程的最小数量。maximumPoolSize:线程池保护线程的最大数量。keepAliveTime:闲暇线程的存活工夫。TimeUnit unit:工夫单位,现有纳秒,微秒,毫秒,秒枚举值。BlockingQueue<Runnable> workQueue:持有期待执行的工作队列。RejectedExecutionHandler handler:用来回绝一个工作的执行,有两种状况会产生这种状况。       一是在execute办法中若addIfUnderMaximumPoolSize(command)为false,即线程池曾经饱和;        二是在execute办法中, 发现runState!=RUNNING || poolSize == 0,即曾经shutdown,就调用ensureQueuedTaskHandled(Runnable command),在该办法中有可能调用reject。

ThreadPoolExecutor池子的解决流程如下:

当池子大小小于corePoolSize就新建线程,并解决申请。当池子大小等于corePoolSize,把申请放入workQueue中,池子里的闲暇线程就去从workQueue中取工作并解决。当workQueue放不下新入的工作时,新建线程入池,并解决申请,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做回绝解决。另外,当池子的线程数大于corePoolSize的时候,多余的线程会期待keepAliveTime长的工夫,如果无申请可解决就自行销毁。

其会优先创立 CorePoolSize 线程, 当持续减少线程时,先放入Queue中,当 CorePoolSiz 和 Queue 都满的时候,就减少创立新线程,当线程达到MaxPoolSize的时候,就会抛出错 误 org.springframework.core.task.TaskRejectedException

另外MaxPoolSize的设定如果比零碎反对的线程数还要大时,会抛出java.lang.OutOfMemoryError: unable to create new native thread 异样。

Reject策略预约义有四种:

ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序受到回绝将抛出运行时 RejectedExecutionException。 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该工作,如果执行器已敞开,则抛弃。ThreadPoolExecutor.DiscardPolicy策略,不能执行的工作将被抛弃。ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未敞开,则位于工作队列头部的工作将被删除,而后重试执行程序(如果再次失败,则反复此过程)。

spring线程池和jdk线程池的区别:

spring的包装了一下jdk,其实底层都是jdk的线程池。

Spring的线程池是为spring本人应用线程的部件而写的。 使得spring组件不依赖Java的并行库而只依赖本人简化的线程相干的封装。

1、什么是线程和过程

过程:过程是指在零碎中正在运行的一个应用程序,程序一旦运行就是过程。

特点:

1、每个过程能够包含多个线程

2、每个过程都有本人独立的内存空间,而其外部的线程能够共享这些内存空间,过程上下文切换的开销比拟大,不同过程之间不共享内存

线程:线程是过程的一个子集,一个线程就是一个指令流的执行,线程依照肯定的程序把这些指令流交给CPU执行,就是线程的执行。

2、什么是同步执行和异步执行

以调用方的角度讲,如果须要期待后果返回能力持续运行的话就是同步,如果不须要期待就是异步。

3、Java中实现多线程有几种办法?

(1)继承 Thread类

定义Thread类的子类,并重写该类的run办法,该run办法的办法体就代表了线程要实现的工作。因而把run()办法称为执行体。 创立Thread子类的实例,即创立了线程对象。调用线程对象的start()办法来启动该线程。

(2)实现runable接口

定义runnable接口的实现类,并重写该接口的run()办法,该run()办法的办法体同样是该线程的线程执行体。创立 Runnable实现类的实例,并依此实例作为Thread的target来创立Thread对象,该Thread对象才是真正的线程对象。调用线程对象的start()办法来启动该线程。

4、sleep和yield的区别?

调用 sleep 会让以后线程从 Running 进入 Timed Waiting 状态(阻塞)

调用 yield 会让以后线程从 Running 进入 Runnable 就绪状态,而后调度执行其它线程

二、音讯队列

常见的MQ:kafka、activemq、rabbitmq、rocketmq

(1)音讯队列有什么长处和毛病:

长处:解耦、异步、削峰

毛病:零碎可用性升高、零碎复杂性进步、数据一致性问题

(2)如何保障音讯不被反复生产

保障音讯生产的幂等性。

写数据时,先依据主键查一下这条数据是否存在,如果曾经存在则 update; 数据库的惟一键束缚也能够保障不会反复插入多条,因为反复插入多条只会报错,不会导致数据库中呈现脏数据;如果是写 redis,就没有问题,因为 set 操作是人造幂等性的。

(3)RabbitMQ的5大外围概念

Connection(连贯)、Channel(信道)、Exchange(交换机)、Queue(队列)、Virtual host(虚拟主机)。

Connection(连贯):每个producer(生产者)或者consumer(消费者)要通过RabbitMQ发送与生产音讯,首先就要与RabbitMQ建设连贯,这个连贯就是Connection。Connection是一个TCP长连贯。

Channel(信道):Channel是在Connection的根底上建设的虚构连贯,RabbitMQ中大部分的操作都是应用Channel实现的,比方:申明Queue、申明Exchange、公布音讯、生产音讯等。

<pre class="prettyprint hljs objectivec">每个线程在拜访RabbitMQ时都要建设一个Connection这样的TCP连贯,对于操作系统来说,建设和销毁TCP连贯是十分大的开销,在零碎拜访流量顶峰时,会重大影响零碎性能。

Channel就是为了解决这种问题,通常状况下,每个线程创立独自的Channel进行通信,每个Channel都有本人的channel id帮忙Broker和客户端辨认Channel,所以Channel之间是齐全隔离的。</pre>

Virtual host(虚拟主机):Virtual host是一个虚拟主机的概念,一个Broker中能够有多个Virtual host,每个Virtual host都有一套本人的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字能够一样。这样,不同的用户在拜访同一个RabbitMQ Broker时,能够创立本人独自的Virtual host,而后在本人的Virtual host中创立Exchange和Queue,很好地做到了不同用户之间互相隔离的成果。

Queue(队列):Queue是一个用来寄存音讯的队列,生产者发送的音讯会被放到Queue中,消费者生产音讯时也是从Queue中取走音讯。

Exchange(交换机):Exchange是一个比拟重要的概念,它是音讯达到RabbitMQ的第一站,次要负责依据不同的散发规定将音讯散发到不同的Queue,供订阅了相干Queue的消费者生产到指定的音讯。

三、java类加载

在java中数据类型分为根本数据类型和援用数据类型。根本数据类型由 虚拟机 事后定义,援用数据类型则须要进行类的加载。

依照java虚拟机标准,从class文件到加载进入内存中的类,再到类卸载出内存为止,整个 生命周期 如下:

将java类的字节码文件加载到机器内存中,并在内存中构建出java类的原型

a、加载类时,java虚拟机加载步骤

通过类的全名,获取类的二进制数据流解析类的二进制数据流为办法区内的数据结构创立java.lang.Class类的实例,作为办法区这个类的各种数据的访入口

b、类模型和Class实例的地位

类模型存储在办法区class文件加载到元空间后,会在堆中创立一个Class对象,用来封装类位于办法区内的数据结构。每一个类都对应一个Class对象

Class类的构造方法是公有的,只有jvm能够建

c、数组类的加载

数组类自身并不是由类加载器负责创立,而是由jvm在运行时依据须要间接创立的,然而数组的元素类型依然须要依附类加载器去创立。创立步骤如下:

如果数组的元素类型是援用类型,那么遵循定义的加载过程递归加载和创立数组A的元素类型jvm应用指定的元素类型和数组维度类创立新的数组类。

四、Linux操作系统常用命令

------------------目录操作命令:mkdir、rmdir、cd、pwdmkdir:创立目录rmdir:删除目录(只能删除空目录)cd:切换当前目录(扭转当前目录)pwd:显示当前目录的门路-----------------文件操作命令:cat、touch、more、less、head、tail、cp、mv、rm、diff、grepcat:显示文件,还能够连贯两个或多个文件,造成新的文件touch:批改文件的拜访工夫,如果文件不存在,则能够创立该文件more:分屏显示文件内容,只可向下翻屏less:分屏显示文件内容,可高低分屏head:查看文件头部内容,默认前10行tail:查看文件尾部内容,默认后10行cp:复制文件或目录mv:挪动文件或目录,还能够重命名rm:删除一个目录中的一个或多个文件diff:逐行比拟两个文本文件,列出其不同之处grep:查找文件内容,能够应用正则表达式------------------日期操作命令:date、cal;date:能够用来显示或设定零碎的日期与工夫cal:用于用于 显示 以后或者指定日期的公历-------------------重定向命令:>、>>、<、<<;>:示意每次只写入最新的数据,原有数据不保留,重定向,笼罩原有内容>>:在原有数据的根底上进行追加,原有数据会保留<:输出重定向<<:读取命令行输出,直到遇到输出行为指定的完结标识字符串-------------------帮忙命令:man、info;man :对命令的具体解释信息info:比man更加具体失去的信息更多------------------清屏命令:clear;clear:该命令作用繁多,就是清屏------------------切换用户命令:su;su:用于切换以后用户身份到其余用户身份,或者以指定用户的身份执行命令或程序-------------------查看以后用户命令:whoami;whoami:显示的是以后用户下的用户名who am i:显示的是登录时的用户名who:显示以后真正登录零碎中的用户(不会显示那些用su命令切换用户的登录者)--------------------信息回显命令:echoecho:是在显示器上显示一段文字,个别起到一个提醒的作用

五、存储过程存储过程的优缺点

长处:

通过把解决封装在容易应用的单元中,简化简单的操作;简化对变动的治理;通常存储过程有助于进步应用程序的性能;存储过程有助于缩小应用程序和数据库服务器之间的流量,因为应用程序不用发送多个简短的 SQL 语句,而只用发送存储过程的名称和参数;存储的程序对任何应用程序都是可重用的和通明的。存储的程序是平安的。

毛病:

如果应用大量存储过程,那么应用这些存储过程的每个连贯的内存使用量将会大大增加。存储过程的结构使得开发具备简单业务逻辑的存储过程变得更加艰难;很难调试存储过程。只有多数数据库管理系统容许您调试存储过程。开发和保护存储过程并不容易。

创立示例:

-- 创立存储过程create procedure mypro(in a int,in b int,out sum int)beginset sum = a+b;end;

调用示例:

call mypro(1,2,@s);-- 调用存储过程select @s;-- 显示过程输入后果

语法解析:

create procedure 用来创立过程; mypro 用来定义过程名称; (in a int,in b int,out sum int)示意过程的参数,其中 in 示意输出参数,out 示意输入参数。相似于 Java 定义方法时的形参和返回值; begin 与 end 示意过程主体的开始和完结,相当于 Java 定义方法的一对大括号; call 用来调用过程,@s 是用来接管过程输入参数的变量。

六、SpringCloud罕用组件

Eureka(服务注册):服务启动的时候,服务上的Eureka客户端会把本身注册到Eureka服务端,并且能够通过Eureka服务端晓得其余注册的服务Ribbon(负载平衡):服务间发动申请的时候,服务消费者方基于Ribbon服务做到负载平衡,从服务提供者存储的多台机器中抉择一台,如果一个服务只在一台机器下面,那就用不到Ribbon抉择机器了,如果有多台机器,那就须要应用Ribbon抉择之后再去应用Feign(近程调用):Feign应用的时候会集成Ribbon,Ribbon去Eureka服务端中找到服务提供者的所在的服务器信息,而后依据随机策略抉择一个,拼接Url地址后发动申请Hystrix(熔断降级):发动的申请是通过Hystrix的线程池去拜访服务,不同的服务通过不同的线程池,实现了不同的服务调度隔离,如果服务呈现故障,通过服务熔断,防止服务雪崩的问题 ,并且通过服务降级,保障能够手动实现服务失常性能Zuul(网关):如果前端调用后盾零碎,对立走zull网关进入,通过zull网关转发申请给对应的服务

但当初罕用组合:SpringCloud Alibaba

注册核心:SpringCloud Alibaba Nacos(代替原生Eureka)

配置核心:SpringCloud Alibaba Nacos (代替原生Eureka)

负载平衡:SpringCloud Ribbon(原生提供)—— OpenFeign中曾经整合,无需显示援用

申明式HTTP客户端:SpringCloud OpenFeign ——调用近程服务

七、webservice和restful区别

webservice底层是SOAP协定,外围是面向流动,有严格的标准和规范,包含平安,事务等方面。restful是一种架构格调,其外围是面向资源,遵循CRUD准则,这个准则对于资源只须要4种行为,别离是:创立,获取,更新和删除,并且这些资源执行的操作时通过HTTP协定规定的。

应用webservice还是restful就须要思考资源自身的 ,看资源自身是那种简略的相似增删改查的业务操作,还是那种比较复杂,如转账,事务处理等。

其次是看是否有严格的标准和规范的,而且有多个业务系统集成和开发的时候,应用SOAP协定就比拟劣势,如果是简略的数据操作,无事务处理,开发和调用比较简单的话应用REST架构格调比拟有劣势,较为简单的面向流动的服务,应用restful意义不大。

八、restful格调与驼峰命名法

restful格调:

Restful是一种设计格调。对于咱们Web开发人员来说。就是应用一个url地址示意一个惟一的资源。而后把原来的申请参数退出到申请资源地址中。而后原来申请的增,删,改,查操作。改为应用HTTP协定中申请形式GET、POST、PUT、DELETE示意。

基于这个格调设计的软件能够更简洁,更有档次,更易于实现缓存等机制。

restful格调中申请形式GET、POST、PUT、DELETE别离示意查、增、改、删。别离示意如下:

GET申请                                对应             查问http://ip:port/工程名/book/1   HTTP申请GET   示意要查问id为1的图书http://ip:port/工程名/book       HTTP申请GET   示意查问全副的图书POST申请  对应  增加http://ip:port/工程名/book       HTTP申请POST  示意要增加一个图书PUT申请   对应  批改http://ip:port/工程名/book/1   HTTP申请PUT   示意要批改id为1的图书信息DELETE申请  对应  删除http://ip:port/工程名/book/1   HTTP申请DELETE    示意要删除id为1的图书信息

驼峰命名法 : 第一个单词以小写字母开始;从第二个单词开始当前的每个单词的首字母都采纳大写字母。如myName、myLastName

九、webservice接口开发

简略的说WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,能够实现不同的语言(通过 xml 形容)间的互相调用,通过Internet进行基于Http协定的网络应用间的交互。

根据Web Service标准施行的利用之间, 无论它们所应用的语言、 平台或外部协定是什么, 都能够相互交换数据。Web Service是自描述、 自蕴含的可用网络模块, 能够执行具体的业务性能。

soapwebService三要素:

SOAP用来形容传递信息的格局

SOAP即简略对象拜访协定(Simple ObjectAccess Protocol),它是用于替换XML(规范通用标记语言下的一个子集)编码信息的轻量级协定。

WSDL 用来形容如何拜访具体的接口

Web Service描述语言WSDL就是用机器能浏览的形式提供的一个正式形容文档而基于XML(规范通用标记语言下的一个子集)的语言,用于形容Web Service及其函数、参数和返回值。因为是基于XML的,因而WSDL既是机器可浏览的,又是人可浏览的。

UDDI用来治理,散发,查问webService

UDDI 的目标是为电子商务创立规范;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册核心的实现标准规范,同时也蕴含一组使企业能将本身提供的Web Service注册,以使别的企业能够发现的拜访协定的实现规范。