Java面试题你都知道哪些?

什么是Spring?
    Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
    Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
    然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
    目的:解决企业应用开发的复杂性
    功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
    范围:任何Java应用  
    它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。


什么是控制反转(或依赖注入)? 
    控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
    IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)”,即由容器动态的将某种依赖关系注入到组件之中 

依赖注入机制减轻了组件之间的依赖关系,同时也大大提高了组件的可移植性,这意味着,组件得到重用的机会将会更多。

AOP的7个专业术语
  1.增强(Advice)
    增强就很好理解了,AOP(切面编程)是用来给某一类特殊的连接点,添加一些特殊的功能,那么我们添加的功能也就是增强啦~
    比如:添加日志、管理事务。
    不过增强不仅仅包含需要增加的功能代码而已,它还包含了方位信息。
    那什么是方位信息呢?
    方位信息就是相对于方法的位置信息,如:方法前、方法后、方法环绕
    为什么要方位信息呢?切点不是确定了需要增强的位置了吗?
    切点定位的是“在什么类的什么方法上”,也就是说,切点只是定位到了方法本身(也叫执行点,特殊的连接点),但是我们增强的内容是放在该方法的前面呢、后面呢?还是前后都要呢?这些切点却没有告诉我们,那么我们该如何确定具体位置呢?
    所以,我们才需要用到方位信息,进一步的定位到具体的增强代码放置的位置。
    咦?增强即包含了【功能】又包含了【方位】,那我是不是不用切点就可以匹配哪些方法,并添加功能了呢?
    恩,确实如此,因为通过方位信息,虽然只是简单的描述了【功能】需要放在方法前、后、还是前后都要等信息,但是我们还是可以通过方位定位到位置。只不过,是匹配到所有类的所有方法!因为方位只是说明在方法前还是方法后,并没有要求是哪些类?哪些方法? — So,我们可以直接使用增强来生成一个切面,而不需要切点,但这并不怎么推荐,因为它是匹配所有方法的。所以,我们才需要用切点来进一步确认位置。
  2.切点(Pointcut)
    一个项目中有很多的类,一个类有很多个连接点,当我们需要在某个方法前插入一段增强(advice)代码时,我们就需要使用切点信息来确定,要在哪些连接点上添加增强。
    那么切点是什么?
    如果把连接点当做数据库中的记录,那么切点就是查找该记录的查询条件。
    所以,一般我们要实现一个切点时,那么我们需要判断哪些连接点是符合我们的条件的,如:方法名是否匹配、类是否是某个类、以及子类等。
  3.连接点(Joinpoint)
    连接点就是程序执行的某个特定的位置,如:类开始初始化前、类初始化后、类的某个方法调用前、类的某个方法调用后、方法抛出异常后等。Spring 只支持类的方法前、后、抛出异常后的连接点。
  4.切面(Aspect)
    切面由切点和增强(或引介)组成,或者只由增强(或引介)实现。
  5.目标对象(Target)
    目标对象就是我们需要对它进行增强的业务类~
    如果没有AOP,那么该业务类就得自己实现需要的功能。
  6.AOP代理(AOP proxy)
    一个类被AOP织入后生成出了一个结果类,它是融合了原类和增强逻辑的代理类。
  7.织入(Weaving)
    织入就是将增强添加到目标类具体连接点上的过程。
         编译期织入,这要求使用特殊java编译器
    类装载期织入,这要求使用特殊的类装载器
    动态代理织入,在运行期为目标类添加增强生成子类的方式
    Spring采用的是动态代理织入,而AspectJ采用编译期织入和类装载期织入。

=============================================JavaSE=================================================
String 类可以被继承吗?为什么?

    不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的

String 和 StringBuilder , StringBuffer 的区别
    首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
    在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
    String:适用于少量的字符串操作的情况
      StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
      StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

String 常用的 方法有哪些?
  length():求字符串的长度 
  indexOf():求某个字符在字符串中的位置    
  charAt():求一个字符串中某个位置的值
  equals():比较两个字符串是否相同
  replace():将字符串中的某些字符用别的字符替换掉。形如                                                                                                                      replace(“abc”,”ddd”);字符串中的abc将会被ddd替换掉。
 split():根据给定正则表达式的匹配拆分此字符串。形如 String s = "The time is going quickly!"; str1=s.split(" ");   
 substring():输出一个新的字符串,它是此字符串中的子串,形如substring(3,7);它将字符串中的第四个第五个第六个输出。
 trim():将字符串开头的空白(空格)和尾部的空白去掉。
 format():使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
 toLowerCase():将字符串中所有的大写改变成小写
 toUpperCase():将字符串中所有的小写改变为大写

array 和 集合的区别?
    (1) 数值是大小固定的,同一数组只能存放一样的数据。
    (2) java集合可以存放不固定的一组数据
    (3) 若程序事不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用

ArrayList 和 LinkedList 的区别 ?
    ArrayList 是 查询快, 但是 增 、 删 、改 慢一些
    LinkedList 是 查询慢, 但是 增 、 删 、改 快一些

重写和重载
    重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
    重载Overloading是一个类中多态性的一种表现。
重写方法的规则:

1)、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。 

2)、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。   

3)、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 

4)、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

冒泡排序
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    针对所有的元素重复以上的步骤,除了最后一个。
    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
    for(int i =0;i<arr.length-1;i++) {       
    for(int j=0;j<arr.length-i-1;j++) {//-1为了防止溢出     
    if(arr[j]>arr[j+1]) {             
        int temp = arr[j];                                       
        arr[j]=arr[j+1];                                         
        arr[j+1]=temp;            
        }            
         }            
    }

成员变量和局部变量的区别
    (1)在类中的位置不同
    成员变量:类中方法外
    局部变量:方法定义中或者方法声明上
    (2)在内存中的位置不同
    成员变量:在堆中
    局部变量:在栈中
    (3)生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    (4)初始化值不同
    成员变量:有默认值
    局部变量:没有默认值,必须定义,赋值,然后才能使用

静态变量和成员变量的区别
    A:所属不同
    静态变量:属于类,类变量
    成员变量:属于对象,对象变量,实例变量
    B:内存位置不同
    静态变量:方法区的静态区
    成员变量:堆内存
    C:生命周期不同
    静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
    成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
    D:调用不同
    静态变量:可以通过对象名调用,也可以通过类名调用
    成员变量:只能通过对象名调用

接口和抽象类的区别?
    抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板
    接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个
    接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情

java的基础数据类型有哪些?
    int、 long、 double、 float、 short、 byte、 char、 boolean

final , finally , finalize 区别??
    final可以用来修饰类,方法和变量(成员变量或局部变量)当用final修饰类的时,表明该类不能被其他类所继承
    final成员变量表示常量,只能被赋值一次,赋值后其值不再改变
    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,
    表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

创建一个 类的实例有几种方法?分别是什么?
    (1)用new 语句创建对象,这是最常用的创建对象方法。 

    (2)运用反射手段,调用Java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 

    (3)调用对象的clone()方法 

    (4)运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。 

===========================================Web前端==================================================
html中 readonly 和 disabled 的区别
    Readonly只针对input(text / password)和textarea有效,
    而disabled对于所有的表单元素都有效,包括select, radio, checkbox, button等。
    但是表单元素在使用了disabled后,当我们将表单以POST或GET的方式提交的话,
    这个元素的值不会被传递出去,而readonly会将该值传递出去(这种情况出现在
    我们将某个表单中的textarea元素设置为disabled或readonly,
    但是submit button却是可以使用的)。

css属性 visibility = "hidden"   和  display = "none"  的区别
    visibility: hidden----将元素隐藏,但是在网页中该占的位置还是占着。
    display: none----将元素的显示设为无,即在网页中不占任何的位置。

window.onload 和 $(function(){})  有什么不同?
    1) window.onload 是在 所有的资源 全部加载完毕后 触发 
    2) $(function(){}) 是在 dom 树 加载完毕后触发

==============================================SQL==================================================
char / varchar / nchar / nvarchar / text 区别?
    char(50)    字节,用来存储定长数据,长度为n个字节
    varchar(50)    字符,存储变长数据
    nchar(50)    字符,固定长度
    nvarchar    可变长度,Unicode字符数据。
    text         超过 255

drop table /  delete from tableName / truncate table tableName
    drop 整张表 都不存在了            ddl
    delete 是 表还在, 数据没了        dml        
    delete 删除数据的时候,自增列不还原,继续增加
    truncate(截断) 清空整张表中的数据,自增列还原

inner join  / left join / right join  区别 ?
    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
    inner join(等值连接) 只返回两个表中联结字段相等的行

===================================================JavaEE===========================================
请求转发 和 重定向 有什么 区别 ?
    1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向
    2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,
    转发之后地址栏上的地址不会变化,还是第一次请求的地址
    3、转发是服务器行为,重定向是客户端行为。重定向时浏览器
    上的网址改变 ,转发是浏览器上的网址不变
    4、重定向是两次request,转发只有一次请求
    5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址 


cookie 和 session 有什么区别?
    Cookie是把用户的数据写给用户的浏览器。
    Session技术把用户的数据写到用户独占的session中。
    Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
        tips:Cookie存在浏览器中,Session存在服务器里。


如果用户禁用 cookie , 那么还能不能使用 session ?
    默认的Session是依赖于 Cookie ,因为 在 Cookie中保存有 JSESSIONID ,
    服务器是根据 session id 去区分每一个客户端的 
    如果客户端禁用 cookie , 默认是无法使用 session 
    如果要禁用cookie 仍然使用 session , 是可以通过 url 中 传递 sessionid 来实现的
    String response.encodeRedirectURL( String originalURL );
    // demo12.jsp;jsessionid=3E730415254C64409D5423FEE7E226DA 
    repsonse.sendRedirect( newURL  ) ;

JSP 9大内置对象 是什么?分别有什么作用?
    Request、response、Out、Session、Application、Cookie、Config、pageContext、Exception 。
    1、Request对象:发送请求时,该对象被创建,一次请求结束后即销毁。
    (一次请求产生一个request对象)该对象封装了用户提交的信息,
    通过调用该对象相应的方法要以获取封装的信息。
    2、Response对象:对客户的请求做出动态响应,向客户端发送数据。
    响应客户请求时创建,响应结束时销毁。(一次响应产生一个response对象)。
    3、Session对象:在页面的page指令加上session="true" 或缺省 
    情况下以及在servlet中使用request.getSession();的方式进行创建。
    超时或服务停止时,session结束。(一个用户对应一个session对象)。
    4、Application对象:启动服务时创建,停止服务时销毁。
    (整个程序只有一个application对象)。
    5、Out对象:请求时,就创建,请求结束时,销毁。
    (一个请求,创建一个out对象)。
    6、cookie对象:cookie是web服务器保存在用户硬盘上的一段文本,
    cookie允许一个web站点在用户电脑上保存信息并且随后再取它。
    7、config对象:配置对象。
    8、page对象:页面对象。
    9、Exception对象:在处理异常的网页中可以直接访问exception隐式对象

web.xml 文件中  可以放置 哪些标签?
    1.ServletContext:对servlet上下文(application对象)进行监听
    2.Session:对session监听
    3.Request:对request的监听   

会话是什么?
    由于HTTP是无状态的,因此无法纪录客户一连串的动作,
    必须有一种机制使服务器能认得客户,这就引入了"会话"概念!
    服务器发给客户一个会话ID,当客户再访问服务器时就带着这个ID,
    服务器就凭着这个唯一的ID来识别用户

Servlet 处理请求的方式为:    
    线程    

AJAX 技术可以带来的便捷有 ?  (选择3项)
    a) 减轻服务器负担    
    b) 无刷新更新页面    
    ×c) 可以调用外部数据    
    d) 可以不使用javascript脚本

JSP 中 ,Web容器处理jsp文件请求需要经过三个阶段
    a)接受请求        
    b)翻译阶段    
    c)编译阶段        
    翻译阶段:这一个阶段,编写好的jsp文件首先被web容器中的jp引擎转换成java源代码 
    编译阶段:jsp文件所翻译的java源代码会被编译成可执行的字节码 
    请求阶段:当容器接受了客户端请求之后,就执行jsp编译的字节码文件,
    处理完成请求之后,容器再把生成的页面反馈给客户端显示。

简单描述Servlet的生命周期
    1.创建servlet实例
    2.当servlet实例化后,将调用这个对象的init()方法进行初始化
    3.再调用对象的service()方法来处理请求,并返回处理结果,
    在调用service之前,需保证init初始化已被成功执行 
    4.当需要释放servlet的时候,调用对象的destroy()方法来结束,并释放资源

进行三层开发时,需要遵循一定的知道原则, 下列说法错误的是
    ×a)上层依赖其下层,依赖关系可以跨层

    b) 下一层不能调用上一层
    c) 下一层不依赖上一层
    d) 在上一层中不能出现下一层的概念

Tomcat 的 conf  , webapps , logs , work  目录下分别存放着什么?
    conf目录主要是用来存放tomcat的一些配置文件。
    webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。
    可以以文件夹、war包、jar包的形式发布应用。
    logs目录用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出
    的日志
    work目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。
    清空work目录,然后重启tomcat,可以达到清除缓存的作用。

描述 Servlet 和 JSP 之间的相同 和 区别 ?
    1、JSP经编译后变成Servlet
    2、jsp更擅长表现于页面显示,Servlet更擅长于逻辑控制
    3、Servlet的应用逻辑是在java文件中,并且完全从表现层
    中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成
    一个扩展名为.jsp的文件。
    JSP是Servlet技术的扩展,本质上是Servlet的简易方式

描述 session 实现的原理
    服务器创建session出来后,会把session的id号,
    以cookie的形式回写给客户机,这样,只要客户机
    的浏览器不关,再去访问服务器时,都会带着session的id号去,
    服务器发现客户机浏览器带session id过来了,就会使用内存中
    与之对应的session为之服务。
    tips:session id以cookie形式存在客户端,只要浏览器不关,
    都可以带着session id来访问服务器端session的内容。

描述 request , session , application 分别的作用是什么? 有什么区别?
    request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,
    返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中
    可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。
    Session是用户全局变量,在整个会话期间都有效。只要页面不关闭就一直
    有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,
    或调用HttpSession的invalidate()方法)。存放在HttpSession对象中
    application是程序全局变量,对每个用户每个页面都有效。存放在
    ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,
    它们就一直可以使用

==============================================MyBatis================================================
描述MyBatis 中 二级缓存的概念和作用
    二级缓存:也叫全局缓存,基于namespace级别的缓存,一个namespace对应一个二级缓存。

    二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,
    多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
    
二级缓存工作过程:    
1.一个会话,查询一条数据,这个回话就会放在一级缓存中;
2.如果会话关闭,一级缓存中的数据会被保存到二级缓存中;
    新的会话查询信息就可以参照二级
缓存中的内容。  
3.sqlsession===EmployeeMapper==>Employee           
    DepartmentMapper==>Department
    不同namespace查出的数据会放在自己对应的mapper中
    效果:
    数据会从二级缓存中获取,查处的数据会被默认保存在一级缓存中,
    只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存去。

描述 MyBatis 中的常用标签
  <select> 查询标签

 <insert>新增标签

 <update>修改标签

 <delete>删除标签

<sql id=""></sql>标签(主要是用来写一些通用的sql语句的,在其他标签中可以使用

<include refid=""></include>来引入标签)

<parameterMap type="" id=""></parameterMap>参数集合

<resultMap type="" id=""></resultMap>结果集

<cache></cache>

<cache-ref namespace=""/> 这两个标签都是缓存标签
    
描述 MyBatis 中懒数据 和 按需加载的概念
    在我们查数据时,mybatis会默认把关联的数据查出来,而关联查询比单表查询慢,
    并且我们有时候不需要那么多的数据。所以我们需要开启懒加载,关联的数据等需
    要的时候再查出来


myBatis开启懒加载,需要在mybatis主配置文件的settings标签
    中配置lazyLoadingEnabled为true
    aggressiveLazyLoading为false。
    lazyLoadingEnabled=true即开启延迟加载,
    aggressiveLazyLoading=false即按需加载。

============================================SpringMVC===============================================
SSM 组合分别是什么? SpringMVC 和 Spring 之间是什么关系?
      spring是一个一站式的框架,提供了表现层(springmvc)
    到业务层(spring)再到数据层(springdata)的全套解决方
    案;spring的两大核心IOC(控制反转)和AOP(面向切面编程)更
    是给我们的程序解耦和代码的简介提供了支持。

 

描述 SpringMVC 流程的所有模块, 按照访问的先后次序进行描述
    第一步:发起请求到前端控制器(DispatcherServlet)
    第二步:前端控制器请求HandlerMapping查找 Handler,可以根据xml配置、注解进行查找
    第三步:处理器映射器HandlerMapping向前端控制器返回Handler
    第四步:前端控制器调用处理器适配器去执行Handler
    第五步:处理器适配器去执行Handler
    第六步:Handler执行完成给适配器返回ModelAndView
    第七步:处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括Model和view
    第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
    第九步:视图解析器向前端控制器返回View
    第十步:前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
    第十一步:前端控制器向用户响应结果

SpringMVC 如何 返回视图(说出两种方法)
    第一种,将返回类型设置为void,或者如果返回类型是字符串,那你返回一个null或者""
    第二种,添加@ResponseBody 注解 返回类型为String

描述Maven的简单配置
    (1)下载好maven的压缩包后,解压到自己想放置的路径(路径中最好不要有中文目录)。
    (2)启动eclipse,打开 Window->Perferences,打开界面,在输入框中输入maven
    (3)点击Installations选项,再点击右侧的add,跳出一个界面,点击Directory,会弹出一个文件目录,这时找的自己解压缩的maven插件后,点击finish
    (4)完成上面一步后,就添加了Maven插件,然后勾选自己添加的apache-maven-3.3.9,点击下端的Apply.
    (5)引入maven插件后,还要设置自己maven设置
    

SpringMVC如何接受路径参数?
    通过@PathVariabl获取路径中的参数
    @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GET)
    public String printMessage1(@PathVariable String id,@PathVariable String name, ModelMap model) {

         System.out.println(id);   
        System.out.println(name);    
        model.addAttribute("message", "111111");
        return "users";
    }


SpringMVC如何使用模型绑定及模型验证?

描述框架、模型、三层架构各自的含义以及之间的区别?
    软件框架是在一定领域内、别人已经对这个领域制作软件所需的基础架构功能、进行了总结、做出了有代码实体的软件框架结构、如果要制作这一领域的软件、可以在别人写好的框架上、继续设计、编写自己的软件、骨头架上填肉、框架有一定的局限性。
    软件的架构是系统的一个草图、阐述了各个组件之间的通讯、划分层次、一旦系统开始详细设计、架构蓝图就很难甚至无法更改、是由软件架构师从无到有设计出来的。
    三层架构:一种设计软件架构的思想
        把软件上从逻辑上分为、表示层(UI)业务逻辑层(BLL)数据访问层(DAL)
        目的:低耦合、高内聚、各司其职、达到易更换、修改、可以分散部署、编码。
     


=============================================线程===================================================
线程和进程有什么区别?
答:一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。
而线程是在进程中执行的一个任务。
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。
不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

如何在Java中实现线程?
答:创建线程有两种方式:
一、继承 Thread 类,扩展线程。
二、实现 Runnable 接口。

启动一个线程是调用run()还是start()方法?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,
这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。

Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,
将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,参考线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

线程的sleep()方法和yield()方法有什么区别?
答:
① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;
    yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

请说出与线程同步以及线程调度相关的方法。
答:
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,
    而是由JVM确定唤醒哪个线程,而且与优先级无关;
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,
    而是让它们竞争,只有获得锁的线程才能进入就绪状态;

Runnable接口和Callable接口的区别
Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

怎么唤醒一个阻塞的线程
如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,
可以中断线程 interrput(),并且通过抛出InterruptedException来唤醒它;
如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

度白白

提前收摊,今晚加鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值