关于typescript:常见的java话题

37次阅读

共计 7783 个字符,预计需要花费 20 分钟才能阅读完成。

一、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、pwd
mkdir: 创立目录

rmdir: 删除目录(只能删除空目录)cd: 切换当前目录(扭转当前目录)pwd: 显示当前目录的门路

----------------- 文件操作命令:cat、touch、more、less、head、tail、cp、mv、rm、diff、grep
cat:显示文件,还能够连贯两个或多个文件,造成新的文件

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 命令切换用户的登录者)-------------------- 信息回显命令:echo
echo: 是在显示器上显示一段文字,个别起到一个提醒的作用 

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

长处:

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

毛病:

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

创立示例:

-- 创立存储过程
create procedure mypro(in a int,in b int,out sum int)
begin
set 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 注册,以使别的企业能够发现的拜访协定的实现规范。

正文完
 0