I/O 阻塞 中断的注意点
---恢复内容开始---
shutdownNow() 方法:
将向所有由ExecutorService 启动的任务发送 interrupt().进行阻断.
但是只有任务进入到一个 (可中断的) 阻塞操作时,
这个中断才会抛出 InterruptedExceptoin 异常.
需要注意的是:
[ I/O ] 和 [ synchronized 块上的等待 ] 是不可以中断的,只有通过关闭底层资源进行中断
所以在 创建I/O 任务的时候, 这意味着 I/O 具有锁住你的多线程程序的现在可能,
特别是对于基于 Web的程序. 但是nio 类的 I/O 是会自动响应中断的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.sql.Time; import java.util.*; import java.util.concurrent.*; class ioTest implements Runnable{ int i = 0 ; @Override public void run() { try { System.out.println( "I can't be caught" ); TimeUnit.SECONDS.sleep( 1 ); } catch (InterruptedException e) { System.out.println( "Caught " + e ); } } } public class Restaurant{ public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute( new ioTest()); //执行任务 executorService.shutdownNow(); } } |
输出:
- I can't be caught
- Exit while
- Caught java.lang.InterruptedException: sleep interrupted
但是如果把TimeUnit.SECONDS.sleep() 放到最前面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.sql.Time; import java.util.*; import java.util.concurrent.*; class ioTest implements Runnable{ int i = 0 ; @Override public void run() { try { TimeUnit.SECONDS.sleep( 1 ); System.out.println( "I can't be caught" ); } catch (InterruptedException e) { System.out.println( "Caught " + e ); } } } public class Restaurant{ public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute( new ioTest()); //执行任务 executorService.shutdownNow(); } } |
输出:
- Caught java.lang.InterruptedException: sleep interrupted
可以得出:
IO无法被阻断,但是TimeUnit.SECONDS.sleep 可以被阻断,并且抛出异常 InterruptedException
如果要阻断IO 可以使用 System.out.close();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何把ASP.NET Core WebApi打造成Mcp Server
· Linux系列:如何用perf跟踪.NET程序的mmap泄露
· 日常问题排查-空闲一段时间再请求就超时
· Java虚拟机代码是如何一步一步变复杂且难以理解的?
· 领域驱动的事实与谬误 一 DDD 与 MVC
· 如何把ASP.NET Core WebApi打造成Mcp Server
· 排行榜的5种实现方案!
· 在 .NET 中使用 Sqids 快速的为数字 ID 披上神秘短串,轻松隐藏敏感数字!
· 突破Excel百万数据导出瓶颈:全链路优化实战指南
· ChatGPT为何放弃WebSocket?揭秘EventSource的三大决胜优势