当前位置: 首页 > Web前端 > HTML5

java常见话题

时间:2023-04-05 23:33:21 HTML5

一、Java多线程编程在java中,要想实现多线程,必须依赖主线程类,而java.lang.Thread是中负责多线程运行的类java,你只需要继承Thread类,它就可以成为主线程类。为了满足一些特殊的需求,也可以通过实现Runnable接口或者Callable接口来完成定义。具体方法如下:1.继承Thread类,重写run方法(无返回值)2.实现Runnable接口,重写run方法(无返回值)3.实现Callable接口,重写call方法(有返回值,可以Throw异常)重点:注意多线程运行数据的一致性,悲观锁和乐观锁的使用。改造线程池的使用:配置参数:corePoolSize:线程池维护线程的最小数量。maximumPoolSize:线程池维护线程的最大数量。keepAliveTime:空闲线程的存活时间。TimeUnitunit:时间单位,纳秒、微秒、毫秒、秒的现有枚举值。BlockingQueueworkQueue:持有等待执行的任务队列。RejectedExecutionHandler处理程序:用于拒绝任务的执行,有两种情况会发生这种情况。 首先,如果execute方法中addIfUnderMaximumPoolSize(command)为false,则线程池饱和;  其次,在execute方法中,如果runState!=RUNNING||调用ensureQueuedTaskHandled(Runnablecommand),其中可以调用reject。ThreadPoolExecutor池的处理流程如下:当池大小小于corePoolSize时,创建一个新的线程,处理请求。当poolsize等于corePoolSize时,将请求放入workQueue,pool中的空闲线程会从workQueue中取出任务并进行处理。当workQueue无法容纳新任务时,将新线程添加到池中并处理请求。如果池大小达到maximumPoolSize,则使用RejectedExecutionHandler进行拒绝处理。另外,当池中的线程数大于corePoolSize时,冗余线程会长时间等待keepAliveTime,如果没有请求处理,就会自行销毁。它将优先创建CorePoolSize线程。继续添加线程时,先将其放入Queue。当CorePoolSiz和Queue都已满时,创建新的线程。当线程达到MaxPoolSize时,将抛出错误org.springframework。core.task.TaskRejectedException另外如果MaxPoolSize的设置大于系统支持的线程数,会抛出java.lang.OutOfMemoryError:unabletocreatenewnativethread异常。预定义了四种类型的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的目标来创建一个Thread对象,这才是真正的线程对象。调用线程对象的start()方法启动线程。4、sleep和yield有什么区别?调用sleep会让当前线程从Running进入TimedWaiting状态(blocked)。调用yield会让当前线程从Running进入Runnable就绪状态,然后调度执行其他线程。2、消息队列常用的MQ:kafka、activemq、rabbitmq、rocketmq(1)消息队列的优缺点有哪些:优点:解耦、异步、调峰缺点:降低系统可用性、增加系统复杂度、数据一致性问题(2)如何保证消息不被重复消费,保证消息消费的幂等性。写入数据时,先根据主键检查数据是否存在,如果存在则更新;数据库的唯一键约束也可以保证不会重复插入多个条目,因为重复插入多个条目只会报错,不会导致数据库出错。脏数据出现;如果是写redis是没有问题的,因为set操作是天然幂等的。(3)RabbitMQ的五个核心概念分别是Connection(连接)、Channel(通道)、Exchange(交换机)、Queue(队列)、Virtualhost(虚拟主机)。连接(connection):每个生产者(producer)或消费者(consumer)想要通过RabbitMQ发送和消费消息,首先要与RabbitMQ建立连接,这个连接就是Connection。连接是TCP长连接。Channel(通道):Channel是在Connection的基础上建立的虚拟连接。RabbitMQ中的大部分操作都是使用Channel完成的,比如:声明Queue、声明Exchange、发布消息、消费消息等。兔子MQ。对于操作系统来说,建立和销毁一个TCP连接是一个非常大的开销。当系统访问流量高峰时,会严重影响系统性能。Channel就是为了解决这个问题。通常,每个线程都会创建一个单独的Channel进行通信。每个Channel都有自己的channelid,帮助Broker和client识别Channel,所以Channel是完全隔离的。Virtualhost(虚拟主机):Virtualhost是虚拟主机的概念。一个Broker中可以有多个虚拟主机。每个虚拟主机都有自己的一套Exchange和Queue。同一个虚拟主机中的Exchange不能和Queue同名,不同虚拟主机中的Exchange和Queue可以重名。这样当不同的用户访问同一个RabbitMQBroker时,可以创建自己独立的虚拟主机,然后在自己的虚拟主机中创建Exchange和Queue,达到了不同用户之间相互隔离的效果。Queue(队列):Queue是用来存储消息的队列。生产者发送的消息会放在Queue中,消费者在消费消息时也会从Queue中取消息。Exchange(开关):Exchange是一个比较重要的概念。它是消息到达RabbitMQ的第一站。主要负责根据不同的分发规则将消息分发到不同的Queue,供订阅相关Queue的消费者消费指定的信息。3、Java类加载java中的数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型需要类加载。根据java虚拟机规范,从类文件到类加载到内存,再到类从内存中卸载,整个生命周期如下:将java类的字节码文件加载到机器中内存,并在内存中构建类java类a的原型。加载类时,java虚拟机加载步骤通过类的全名获取类的二进制数据流,解析类的二进制数据流,为数据创建java.lang.Class类的实例方法区中的结构作为方法区b中本类各种数据的访问点,类模型和Class实例所在的位置,类模型存放在方法区。类文件加载到元空间后,会在堆中创建一个Class对象,用于封装位于方法中的类。区域中的数据结构。每个类对应一个类对象。Class类的构造方法是私有的,只有jvm才能创建c,以及数组类的加载。数组类本身不是由类加载器创建的,而是由jvm在运行时根据需要直接创建的。是的,但是数组的元素类型仍然需要类加载器来创建。创建步骤如下:如果数组的元素类型是引用类型,则按照定义的加载过程递归加载并创建数组的元素类型jvm使用指定的元素类型和数组创建一个新的数组类维度类。4、Linux操作系统常用命令----------------目录操作命令:mkdir、rmdir、cd、pwdmkdir:创建目录rmdir:删除目录(只能删除空目录)cd:Switchthecurrentdirectory(改变当前目录)pwd:显示当前目录的路径------------------文件操作命令:cat,touch,more,less,head,tail,cp,mv,rm,diff,grepcat:显示文件,将两个或多个文件连接起来形成一个新文件touch:修改文件的访问时间,如果文件没有存在,可以创建文件more:splitscreendisplay文件内容只能向下滚动。less:分屏显示文件内容,可以上下分屏。head:查看文件头部内容,默认前10行tail:查看文件尾部内容,默认最后10行cp:复制一个文件或目录mv:移动一个文件或目录,也可以重命名rm:删除目录中的一个或多个文件diff:逐行比较两个文本文件,并列出它们的差异grep:查找文件内容,可以使用正则表达式------------------日期运算指令:date、cal;date:可用于显示或设置系统的日期和时间cal:用于显示当前或指定日期的公历--------------------重定向命令:>、>>、<、<<;>:表示每次只写入最新的数据,不保留原来的数据,重定向,覆盖原来的内容>>:在原来的数据基础上追加,会保留原来的数据<:输入redirection<<:读取命令行输入,直到遇到输入行为指定的结尾Identificationstring------------------帮助命令:man,info;man:命令信息详解info:比man获取的信息更详细------------------清屏命令:clear;clear:该命令功能单一,就是清屏------------------切换用户命令:su;su:用于将当前用户身份切换为另一个用户身份,或者以指定用户身份执行命令或程序------------------查看当前用户命令:whoami;whoami:显示当前用户的用户名whoami:显示登录时的用户名who:显示当前实际登录系统的用户(使用su命令切换用户的登录不会显示方式)-------------------信息回显命令:echoecho:在显示器上显示一段文字,一般起到提示作用。五、存储过程的优缺点Processing被封装在易于使用的单元中,简化了复杂的操作;简化变更管理;通常存储过程有助于提高应用程序性能;存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多条冗长的SQL语句,而只需发送存储过程的名称和参数;存储过程对任何应用程序都是可重用和透明的。存储过程是安全的。缺点:如果使用大量存储过程,使用这些存储过程的每个连接的内存使用量会显着增加。存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难;很难调试存储过程。只有少数数据库管理系统允许您调试存储过程。开发和维护存储过程并不容易。创建示例:--创建存储过程createproceduremypro(inaint,inbint,outsumint)beginsetsum=a+b;结尾;调用示例:调用mypro(1,2,@s);--callStoredprocedureselect@s;--Displayprocedureoutput语法分析:createprocedure用于创建一个过程;mypro用于定义过程名;(inaint,inbint,outsumint)表示程序的参数,其中in表示输入参数,out表示输出参数。类似于Java定义方法时的形参和返回值;begin和end表示流程体的开始和结束,相当于Java中定义方法的一对花括号;call用于调用进程,@s用于接收进程输出参数变量。6、Eureka(服务注册),SpringCloud的一个公共组件:当服务启动时,服务上的Eureka客户端会把自己注册到Eureka服务器上,并可以通过Eureka服务器知道其他注册的服务Ribbon(负载均衡):服务之间服务消费者在发起请求时,基于Ribbon服务实现负载均衡,在服务提供者存储的多台机器中选择一台。如果服务仅在一台机器上,则功能区不用于选择机器,如果有多台机器,需要使用Ribbon选择,然后使用Feign(远程调用):使用Feign时,会整合Ribbon,Ribbon会去Eureka服务器寻找服务商的服务器信息,然后根据随机选择一种策略,拼接Url地址(融合降级)后向Hystrix发起请求:发起的请求是通过Hystrix线程池访问服务。不同的服务通过不同的线程池实现不同的服务调度隔??离。如果服务出现故障,通过服务熔断,避免服务雪崩的问题,通过服务降级,保证服务的正常功能,可以手动实现Zuul(网关):如果前端调用后台系统,它会统一通过zull网关进入,通过zull网关将请求转发给相应的服务。现在常用组合:SpringCloudAlibabaRegistry:SpringCloudAlibabaNacos(替代原生Eureka)配置中心:SpringCloudAlibabaNacos(替代原生Eureka)负载均衡:SpringCloudRibbon(原生提供)-OpenFeign中已经集成,无需显示引用声明HTTPClient:SpringCloudOpenFeign——调用远程服务七、webservice和restful的区别webservice底层是SOAP协议,其核心是面向活动的,有严格的规范和标准,包括安全、事务等方面.Restful是一种以资源为核心,遵循CRUD原则的架构风格。该原则只要求资源有4种行为,即:创建、获取、更新和删除,这些资源所执行的操作由HTTP协议指定。.使用webservice还是restful,需要考虑资源本身,看资源本身是简单的增删改查业务操作,还是更复杂的业务操作,如传输、事务处理等。二是看是否有严格的规范和标准,在多个业务系统集成开发时,使用SOAP协议更有优势。如果是简单的数据操作,没有事务处理,开发和调用都比较简单,那么使用REST架构风格更有优势,对于更复杂的面向活动的服务,使用restful意义不大。8.Restful风格和驼峰命名法Restful风格:Restful是一种设计风格。对于我们网络开发人员。就是用一个url地址来表示一个唯一的资源。然后在请求资源地址中加上原来的请求参数。然后对原请求进行增删改查。而是使用HTTP协议中的请求方法GET、POST、PUT和DELETE。基于这种风格设计的软件可以更简洁、更有层次感,也更容易实现缓存等机制。在restful风格中,请求方法GET、POST、PUT、DELETE分别代表查询、增、改、删。分别表示如下:GET请求对应查询http://ip:port/项目名/book/1HTTP请求GET表示查询id为1的书http://ip:port/项目名/bookHTTP请求GET表示查询所有图书POST请求对应添加http://ip:port/项目名称/bookHTTP请求POST表示添加图书PUT请求对应修改http://ip:port/项目名称/book/1HTTP请求PUT表示修改id为1的图书信息,DELETE请求对应删除http://ip:port/项目名/book/1。HTTP请求DELETE表示删除id为1的图书信息。命名法:第一个单词以小写字母开头;将以第二个单词开头的每个单词的第一个字母大写。如myName,myLastName九、webservice接口开发简单的说,WebService是一个SOA(面向服务编程)架构,不依赖于语言和平台,可以实现不同语言之间的相互交互(通过xml描述)调用,基于Http协议的网络应用程序之间的交互是通过互联网进行的。根据Web服务规范实现的应用程序可以相互交换数据,而不管它们使用何种语言、平台或内部协议。WebService是一个自描述和自包含的可用网络模块,可以执行特定的业务功能。soapwebService的三要素:SOAP是用来描述传递信息的格式。SOAP即简单对象访问协议(SimpleObjectAccessProtocol),它是一种用于交换XML(标准通用标记语言的子集)编码信息的轻量级协议。WSDL用于描述如何访问特定的接口。Web服务描述语言WSDL是一种基于XML(标准通用标记语言的子集)的以机器可读的方式提供的正式描述文档。它用于描述WebServices及其功能、参数和返回值。因为它基于XML,所以WSDL既是机器可读的,也是人类可读的。UDDI用于管理、分发和查询webService。UDDI的目的是为电子商务创建标准;UDDI是一组用于Web服务的基于Web的分布式信息注册标准。它还包括一套使用方法企业可以注册自己提供的WebService,以便其他企业发现访问协议的实现标准。