每天面试题:2024-01-15
每天面试题:2024-01-15
Q1:java 中如何停止一个线程
嗯,首先Java中线程是由操作系统进行调度的,操作系统在线程任务处理完之后,销毁工作线程,理论上不存在停止线程这一操作,但是在实际的应该场景中,我们在下面两种场景需要用的中断一个线程的逻辑
1. 因为业务逻辑需求,我们需要中断一个休眠中的线程
2. 我们使用多线程进行数据比对的时候,需要在一个 循环中中断比对线程
Java在最开始的时候提供了`#stop()` 方法,来停止一个运行中的线程,这个方式是不友好的中断方式,且现在Java官方已经把`#stop()`方法标记为已过时,因为这个方式中断线程会导致资源无法正确释放或者让工作线程的工作到一半就被停止。
我们一般是使用`#interrupt()`来把线程标记为一个中断的状态,这个状态需要我们在实现线程工作逻辑的时候,通过`#isInterrupted()·来感知这个中断信号,然后自行决定是否退出,或者如决定如何退出
Q2: 项目是使用 Dubbo 还是 OpenFeign,是使用 Http 还是使用 RPC
Dubbo是一个种基于RPC的分布式服务框架,它提供了服务注册和发现,以及跨进程的远程通信,如果我们项目要求高性能和高可靠性,复杂服务治理的能力则Dubbo是一个很好的选择
OpenFeign 是一个 声明式的 Http 客户端,如果我们在项目只是使用简单的Http 协议进行通信,并且希望通过将Java方法的调用映射成一个Http请求,那么 OpenFeign 是一个很好的选择
HTTP 是基于文本传输的应用层协议,RPC是一种远程过程调用协议。Http 协议主要用于跨互联网进行网络之间的通信,而RPC更多是跨进程,或者是跨机器之间的通信
Q3: 如何在Java中实现一个 无锁的数据结构
无锁数据结构可以让我们在多线程中在保证线程安全的情况下实现高性能存储,在Java中我们可以同 `java.util.current.atomic`包下面的 原子类来实现无锁情况下的线程安全控制,然后通过 `CAS`操作来实现数据变更的时候的数据安全
![]()