企业真题(异常处理、多线程)

二、企业真题

2.1 异常概述

1. Java的异常体系简单介绍下(网*)
包含问题:
> 4.异常的顶级接口是什么(软**力)
> 异常类的继承关系,exception下都有哪些类?(上海*冉信息)

在这里插入图片描述

2. Java异常处理机制(*科软)

两种处理方案:try-catch-finally ;throws

3. 异常的两种类型,Error和Exception的区别(上海冠*新创、北京中**译、*度)

Error是编译时错误和系统错误,系统错误在除特殊情况下,都不需要你来关心,基本不会出现。而编译时错误,如果你使用了编译器,那么编译器会提示。

Exception则是可以被抛出的基本类型,我们需要主要关心的也是这个类。
Exception又分为RunTimeException和其他Exception。

4. 运行时异常与一般异常有何异同?(华*思为)

运行时异常:RuntimeException

  • 编译可以通过。在运行时可能抛出。出现的概率高一些;一般针对于运行时异常,都不处理。

一般异常:Exception

  • 编译不能通过。要求必须在编译之前,考虑异常的处理。不处理编译不通过。
5. 说几个你常见到的异常(华油**普)
类似问题:
> 请列出Java中常见的几种异常?(百*园)
> 给我一个你最常见到的runtime exception。(*蝶)

1、算术异常类:ArithmeticException

2、空指针异常类:NullpointerException

3、类型强制转换异常:ClassCastException

4、数组下标越界异常:ArrayIndexOutOfBoundsException

5、文件未找到异常:FileNotFoundException

6、操作数据库异常:SQLException

7、I/O 异常的根类:IOException

8、线程中断:InterruptedException

2.2 try-catch-finally

1. 说说final、finally、finalize的区别(北京中**译、艾*软件、拓*思、*科软)
类似问题:
> 1. finally和final的区别(*科软)

final 用于声明 属性(属性不可交变)、方法(方法不可覆盖)、类(类不可继承)。

finally 是 异常处理语句结构 的一部分,不管是否有异常,他的语句总是执行。

finalize 是Object类的一个方法,主要是在收集器执行的时候会调用被回收对象的此方法,进行资源回收,例如关闭文件等。

2. 如果不使用try-catch,程序出现异常会如何?(上海冠*新创科技)

对于当前方法来讲,如果不使用try-catch,则在出现异常对象以后会抛出此对象。如果没有处理方案,就会终止程序的执行。

3. try … catch捕捉的是什么异常?(北京亿*东方)

Exception。非Error

4. 如果执行finally代码块之前方法返回了结果或者jvm退出了,这时finally块中的代码还会执行吗?(恒*电子)

特别的:System.exit(0);

5. 在try语句中有return语句,最后写finally语句,finally语句中的code会不会执finally是一定会执行的

只有代码中有system.exit() 这一种情况 才不会执行finally
因为终止了虚拟机进程
finally会在return之前执行

如果在finally里面有return情况会更复杂

6. 捕获异常在catch块里一定会进入finally吗?catch里能return吗?catch里return还会进finally吗?在try里return是什么情况?(*蓝)

即使 try或catch语句块中有return语句,finally也是会执行的,而且最后返回值取决于finally中的返回值。

2.3 throw与throws

1. throw和throws的区别?(北京亿**方、北京新*阳光)

角度1:“形”,即使用的格式

throw:使用在方法内部,“throw 异常类的对象”
throws:使用在方法的声明处,"throws 异常类1,异常类2,..."

角度2:"角色"或作用不同。

上游排污,下游治污。

过程1:“抛”
	>throw
过程2:“抓”
    > try-catch ; throws
2. 子类重写父类抛出异常的方法,能否抛出比父类更高级别的异常类(顺*)

不能!

2.4 自定义异常

1. 如何自定义一个异常?(*软国际)

(1)创建自定义异常类。

(2)在方法中通过throw关键字抛出异常对象。

(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throw关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

(4)在出现异常的方法的调用者中捕获并处理异常。

二、企业真题

2.1 线程概述

1. 什么是线程(*云网络)

线程(Thread):轻量级进程,是操作系统进行调度的最小单位。一个线程是一个任务(一个程序段)的一次执行过程。线程不占有内存空间,它包括在进程的内存空间中。在同一个进程内,多个线程共享进程的资源。一个进程至少有一个线程。

2. 线程和进程有什么区别(*团、腾*、*云网络、神**岳、言*有物、直*科技)

进程:对应一个运行中的程序。

线程:运行中的进程的一条或多条执行路径。

3. 多线程使用场景(嘉*医疗)
  • 手机app应用的图片的下载
  • 迅雷的下载
  • Tomcat服务器上web应用,多个客户端发起请求,Tomcat针对多个请求开辟多个线程处理

2.2 如何实现多线程

1. 如何在Java中出实现多线程?(阿*校招、当*置业、鸿*网络、奥*医药、*科软、慧*、上海驿*软件、海*科)
类似问题:
> 创建多线程用Runnable还是Thread(北京中*瑞飞)
> 多线程有几种实现方法,都是什么?(锐*(上海)企业管理咨询)

四种。

2. Thread类中的start()和run()有什么区别?(北京中油**、爱*信、神*泰岳、直*科技,*软国际,上海*学网络)

start():① 开启线程 ② 调用线程的run()

3. 启动一个线程是用run()还是start()?(*度)

start()

4. Java中Runnable和Callable有什么不同?(平*金服、银*数据、好*在、亿*征信、花儿**网络)
与之前的方式的对比:与Runnable方式的对比的好处
> call()可以有返回值,更灵活
> call()可以使用throws的方式处理异常,更灵活
> Callable使用了泛型参数,可以指明具体的call()的返回值类型,更灵活

有缺点吗?如果在主线程中需要获取分线程call()的返回值,则此时的主线程是阻塞状态的。
5. 什么是线程池,为什么要使用它?(上海明*物联网科技)
此方式的好处:
> 提高了程序执行的效率。(因为线程已经提前创建好了)
> 提高了资源的复用率。(因为执行完的线程并未销毁,而是可以继续执行其他的任务)
> 可以设置相关的参数,对线程池中的线程的使用进行管理

2.3 常用方法、生命周期

1. sleep() 和 yield()区别?(神*泰岳)

sleep():一旦调用,就进入“阻塞”(或TIMED_WAITING状态)

yield():释放cpu的执行权,处在RUNNABLE的状态

2. 线程创建的中的方法、属性情况?(招通**、数*互融)

创建线程的办法
① 继承Thread类,重写run方法,run方法是新线程的入口
② 实现Runnable接口,重写run
③ 使用匿名内部类,实现创建Thread子类的方式
④ 使用匿名内部类,实现 实现Runnable接口的方式
⑤ 使用Lambda表达式(lambda本质上是一个“匿名函数”)
(其实lambda表达式一般用于一个方法的实现上,该方法可以作为参数传入)
线程的创建不不止这5中,还有两种后续介绍。

3. 线程的生命周期?(中国**电子商务中心、*科软、慧*)

在这里插入图片描述

4. 线程的基本状态以及状态之间的关系?(直*科技)
类似问题:
> 线程有哪些状态?如何让线程进入阻塞?(华*中*,*兴)
> 线程有几个状态,就绪和阻塞有什么不同。(美*)
> Java的线程都有哪几种状态(字*跳动、*东、*手)

在这里插入图片描述

5. stop()和suspend()方法为何不推荐使用?(上海驿*软件)

stop():一旦执行,线程就结束了,导致run()有未执行结束的代码。stop()会导致释放同步监视器,导致线程安全问题。

suspend():与resume()搭配使用,导致死锁。

6. Java 线程优先级是怎么定义的?(软*动力)

三个常量。[1,10]

2.4 线程安全与同步机制

1. 你如何理解线程安全的?线程安全问题是如何造成的?(*软国际)
类似问题:
> 线程安全说一下?(奥*医药)
> 对线程安全的理解(*度校招)
> 什么是线程安全?(银*数据)

(一)站在开发者的角度看:①多个线程之间操作同一个数据②至少有一个线程修改这个数据(不是读操作而是写操作)

(二)站在系统的角度看:一条语句对应多个指令,线程调度可以发生任何时刻(线程调度不会切割指令),所以线程调度不确定性导致指令执行顺序不确定,导致问题。

(三)线程不安全表现为三个部分:①原子性被破坏②内存可见性问题③代码重排序问题

2. 多线程共用一个数据变量需要注意什么?(史*夫软件)

线程安全问题

3. 多线程保证线程安全一般有几种方式?(来*科技、北京*信天*)
类似问题:
> 如何解决其线程安全问题,并且说明为什么这样子去解决?(北京联合**)
> 请说出你所知道的线程同步的方法。(天*伟业)
> 哪些方法实现线程安全?(阿*)   
> 同步有几种实现方法,都是什么? (锐*企业管理咨询)
> 你在实际编码过程中如何避免线程安全问题?(*软国际)
> 如何让线程同步?(*手)
> 多线程下有什么同步措施(阿*校招)
> 同步有几种实现方法,都是什么?(海*科)
  • 同步机制
  • Lock接口
4. 用什么关键字修饰同步方法?(上海驿*软件)

synchronized

5. synchronized加在静态方法和普通方法区别(来*科技)

同步监视器不同。静态:当前类本身 非静态:this

6. Java中synchronized和ReentrantLock有什么不同(三*重工)
类似问题:
> 多线程安全机制中 synchronized和lock的区别(中*国际、*美、鸿*网络)
> 怎么实现线程安全,各个实现方法有什么区别?(美*、字*跳动)
> synchronized 和 lock 区别(阿*、*壳)
synchronized不管是同步代码块还是同步方法,都需要在结束一对{}之后,释放对同步监视器的调用。
Lock是通过两个方法控制需要被同步的代码,更灵活一些。
Lock作为接口,提供了多种实现类,适合更多更复杂的场景,效率更高。
7. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(鸿*网络)

需要看其他方法是否使用synchronized修饰,同步监视器的this是否是同一个。

只有当使用了synchronized,且this是同一个的情况下,就不能访问了。

8. 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?(阿*校招、西安*创佳*)

同步一定阻塞;阻塞不一定同步。

2.5 死锁

1. 什么是死锁,产生死锁的原因及必要条件(腾*、阿*)
1. 如何看待死锁?
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
我们编写程序时,要避免出现死锁。

2. 诱发死锁的原因?
- 互斥条件
- 占用且等待
- 不可抢夺(或不可抢占)
- 循环等待

以上4个条件,同时出现就会触发死锁。


3. 如何避免死锁?
针对条件1:互斥条件基本上无法被破坏。因为线程需要通过互斥解决安全问题。
针对条件2:可以考虑一次性申请所有所需的资源,这样就不存在等待的问题。
针对条件3:占用部分资源的线程在进一步申请其他资源时,如果申请不到,就主动释放掉已经占用的资源。
针对条件4:可以将资源改为线性顺序。申请资源时,先申请序号较小的,这样避免循环等待问题。
2. 如何避免死锁?(阿*、北京*蓝、*手)

见上。

2.6 线程通信

1. Java中notify()和notifyAll()有什么区别(汇*天下)
notify():一旦执行此方法,就会唤醒被wait()的线程中优先级最高的那一个线程。(如果被wait()的多个线程的优先级相同,则
         随机唤醒一个)。被唤醒的线程从当初被wait的位置继续执行。
notifyAll():一旦执行此方法,就会唤醒所有被wait的线程。
2. 为什么wait()和notify()方法要在同步块中调用(北京*智)

因为调用者必须是同步监视器。

3. 多线程:生产者,消费者代码(同步、wait、notifly编程)(猫*娱乐)
类似问题:
> 如何写代码来解决生产者消费者问题(上海明*物联网)
> 多线程中生产者和消费者如何保证同步(*为)
> 消费者生产者,写写伪代码(字*)

4. wait()和sleep()有什么区别?调用这两个函数后,线程状态分别作何改变?(字*、*东)
类似问题:
> 线程中sleep()和wait()有什么区别?(外派*度)
> Java线程阻塞调用 wait 函数和 sleep 区别和联系(阿*)
> wait和sleep的区别,他们两个谁会释放锁(软*动力、*创)
相同点:一旦执行,当前线程都会进入阻塞状态

不同点:
> 声明的位置:wait():声明在Object类中
            sleep():声明在Thread类中,静态的
> 使用的场景不同:wait():只能使用在同步代码块或同步方法中
               sleep():可以在任何需要使用的场景
> 使用在同步代码块或同步方法中:wait():一旦执行,会释放同步监视器
                          sleep():一旦执行,不会释放同步监视器
> 结束阻塞的方式:wait(): 到达指定时间自动结束阻塞 或 通过被notify唤醒,结束阻塞
               sleep(): 到达指定时间自动结束阻塞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值