news 2026/6/9 14:50:44

Java面试必问:什么是阻塞式方法?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java面试必问:什么是阻塞式方法?

文章目录

  • Java面试必问:什么是阻塞式方法?
    • 一、引言:阻塞式方法是什么?
    • 二、生活中的阻塞式方法
    • 三、Java中的阻塞式方法
      • 1. 输入输出流的read()方法
      • 2. 线程睡眠Thread.sleep()
      • 3. 等待锁
    • 四、阻塞式方法的优缺点
      • 优点
      • 缺点
    • 五、如何避免阻塞?
      • 1. 非阻塞式编程
      • 2. 异步编程
      • 3. 响应式编程
    • 六、总结
    • 希望这篇长文对你有所帮助!如果你有其他问题,随时可以问我哦!
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

Java面试必问:什么是阻塞式方法?

大家好,我是闫工。今天我们要聊一个Java面试中必问的问题——“什么是阻塞式方法?”这个问题看起来简单,但里面可大有文章。作为一个老司机(码农),我不仅要告诉你们答案,还要用一些生活中的例子和代码来让这个概念更加生动有趣。

一、引言:阻塞式方法是什么?

首先,我们得弄清楚什么是阻塞式方法。阻塞式方法,简单来说就是一种会让程序执行“卡住”的方法。就像你在马路上等红绿灯一样,车不能动,人也不能走,只能等信号变了才能继续前进。

在Java中,阻塞式方法通常指的是那些会一直等待某个操作完成,直到条件满足或资源可用才会返回的方法。这些方法会让调用它们的线程进入阻塞状态,无法执行其他任务。

二、生活中的阻塞式方法

为了更好地理解这个概念,我们可以从生活中找一些例子:

  1. 红绿灯:你开车到路口,遇到红灯,只能等绿灯亮了才能继续前进。这就是一个典型的阻塞过程。
  2. 银行排队:你去银行办理业务,发现所有柜台都在忙,只好坐在椅子上等待叫号。直到有空闲的柜员为止,这个等待的过程也是阻塞式的。

这些例子告诉我们,阻塞式方法的核心在于“等待”,而这种等待会占用资源,影响效率。

三、Java中的阻塞式方法

现在我们回到编程世界,看看Java中有哪些常见的阻塞式方法。

1. 输入输出流的read()方法

InputStream的read()方法就是一个典型的阻塞式方法。假设你从网络上读取数据,如果数据还没到达,read()就会一直等待,直到数据到来或者连接被关闭。

// 阻塞式代码示例publicclassBlockingExample{publicstaticvoidmain(String[]args){try(BufferedReaderreader=newBufferedReader(newFileReader("file.txt"))){Stringline;while((line=reader.readLine())!=null){// 这里会阻塞,直到读取到数据或者文件结束System.out.println(line);}}catch(IOExceptione){e.printStackTrace();}}}

2. 线程睡眠Thread.sleep()

Thread.sleep()也是一个常见的阻塞式方法。它会让当前线程暂停执行指定的时间,这段时间内线程无法处理任何任务。

publicclassSleepExample{publicstaticvoidmain(String[]args){try{System.out.println("Going to sleep...");Thread.sleep(2000);// 阻塞2秒System.out.println("Woke up!");}catch(InterruptedExceptione){e.printStackTrace();}}}

3. 等待锁

在多线程编程中,当一个线程试图获取一个已经被其他线程占用的锁时,它会进入阻塞状态,直到锁被释放。

publicclassLockExample{privatefinalObjectlock=newObject();publicvoidsomeMethod(){synchronized(lock){// 如果lock被其他线程占用,当前线程会被阻塞try{Thread.sleep(1000);// 模拟长时间操作}catch(InterruptedExceptione){e.printStackTrace();}}}}

四、阻塞式方法的优缺点

优点

  1. 简单易用:阻塞式编程通常比非阻塞式编程更容易理解和实现。
  2. 资源控制:在某些情况下,阻塞可以确保资源不会被多个线程同时访问,从而避免竞争条件。

缺点

  1. 性能问题:如果一个线程因为等待某个操作而被阻塞,它将无法执行其他任务,这可能导致资源浪费和性能下降。
  2. 潜在的死锁风险:在复杂的多线程环境中,如果不小心管理锁,可能会导致死锁。

五、如何避免阻塞?

虽然阻塞式方法有其用途,但在高并发场景下,我们通常希望避免使用它们。以下是一些替代方案:

1. 非阻塞式编程

非阻塞式方法不会让线程一直等待,而是会立即返回一个状态,告诉调用者当前操作是否完成。

publicclassNonBlockingExample{publicstaticvoidmain(String[]args){FutureTask<String>task=newFutureTask<>(()->{Thread.sleep(2000);return"Hello, non-blocking world!";});newThread(task).start();System.out.println("Doing other things...");// 其他任务try{Stringresult=task.get();// 这里会阻塞,直到任务完成System.out.println(result);}catch(InterruptedException|ExecutionExceptione){e.printStackTrace();}}}

2. 异步编程

异步编程允许我们在等待某个操作完成时继续执行其他任务。Java提供了CompletableFuture来支持异步编程。

importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;publicclassAsyncExample{publicstaticvoidmain(String[]args){CompletableFuture<String>future=CompletableFuture.supplyAsync(()->{try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}return"Hello, async world!";});System.out.println("Doing other things...");future.whenComplete((result,exception)->{if(exception!=null){exception.printStackTrace();}else{System.out.println(result);}});// 防止主线程结束try{Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}}}

3. 响应式编程

响应式编程通过观察者模式来处理异步事件。Java的RxJava是一个流行的响应式编程库。

importio.reactivex.Observable;importio.reactivex.observers.DisposableObserver;publicclassReactiveExample{publicstaticvoidmain(String[]args){Observable<String>observable=Observable.create(emitter->{try{Thread.sleep(2000);emitter.onNext("Hello, reactive world!");emitter.onComplete();}catch(InterruptedExceptione){e.printStackTrace();}});DisposableObserver<String>observer=newDisposableObserver<String>(){@OverridepublicvoidonNext(Stringvalue){System.out.println(value);}@OverridepublicvoidonError(Throwablee){e.printStackTrace();}@OverridepublicvoidonComplete(){System.out.println("Completed!");}};observable.subscribe(observer);// 防止主线程结束try{Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}}}

六、总结

阻塞式方法在简单场景下非常有用,但在高并发和高性能需求的系统中,它们可能导致性能瓶颈。通过使用非阻塞、异步或响应式编程技术,我们可以更高效地利用资源并提高系统的吞吐量。

希望这篇长文对你有所帮助!如果你有其他问题,随时可以问我哦!

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 19:32:56

PyTorch-CUDA-v2.7镜像中设置随机种子保证实验可重复性

PyTorch-CUDA-v2.7 镜像中设置随机种子保证实验可重复性 在深度学习项目中&#xff0c;你是否遇到过这样的情况&#xff1a;昨天训练出一个高精度模型&#xff0c;今天用同样的代码和数据重新跑一遍&#xff0c;结果却差了一大截&#xff1f;更糟糕的是&#xff0c;当你试图向导…

作者头像 李华
网站建设 2026/6/10 11:46:08

Java面试:掌握ReadWriteLock性能优化技巧!

文章目录Java面试&#xff1a;掌握ReadWriteLock性能优化技巧&#xff01;一、ReadWriteLock是什么&#xff1f;二、ReadWriteLock的实现类&#xff1a;ReentrantReadWriteLock三、ReadWriteLock的性能优势1. **高并发场景下的优势**2. **降低锁竞争**四、ReadWriteLock的使用场…

作者头像 李华
网站建设 2026/6/4 18:06:39

PyTorch-CUDA-v2.7镜像中部署ChatGLM3的完整流程

PyTorch-CUDA-v2.7镜像中部署ChatGLM3的完整流程 在大模型落地日益迫切的今天&#xff0c;如何快速、稳定地将像 ChatGLM3 这样的先进语言模型投入实际服务&#xff0c;是许多AI团队面临的核心挑战。尤其是在多GPU服务器环境中&#xff0c;环境依赖复杂、CUDA版本错配、显存管…

作者头像 李华
网站建设 2026/6/10 13:46:37

高质量文献综述原来这么写!借助Gemini 3 Pro+四步法,手把手教你写出有逻辑深度的综述

文献综述是展示研究逻辑和学术视野的关键环节,很多同仁总以为写文献综述就是把与之相关的论文摘要罗列一遍就差不多了。实际上,文献综述的本质不是罗列,而是要理解现状,发现问题,用你的研究去补全前人研究空白。 今天七哥用四步法,结合Gemini 3 Pro教你写出高质量的文献…

作者头像 李华
网站建设 2026/6/8 16:47:33

[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

RK3588 U-Boot网络功能深度分析 本文档深入分析RK3588平台上U-Boot的网络功能实现,包括GMAC驱动、TFTP/NFS启动、网络命令以及MAC地址传递到Linux内核的机制。 目录 网络驱动架构概述 GMAC驱动实现 TFTP启动功能 NFS启动功能 网络命令实现 通过网络更新镜像分区 MAC地址传递到…

作者头像 李华
网站建设 2026/6/9 20:54:24

国内用户专属福利:PyTorch-CUDA-v2.7镜像阿里云加速源

国内用户专属福利&#xff1a;PyTorch-CUDA-v2.7镜像阿里云加速源 在深度学习项目启动的前48小时&#xff0c;有多少开发者真正用在了写代码上&#xff1f;恐怕大部分时间都花在了环境配置——安装 PyTorch、匹配 CUDA 版本、调试 cuDNN 兼容性……尤其是当你面对一个全新的服务…

作者头像 李华