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();
    }
}

  输出:

  1. I can't be caught
  2. Exit while
  3. 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();
    }
}

 输出:

  1. Caught java.lang.InterruptedException: sleep interrupted

 

可以得出:

  IO无法被阻断,但是TimeUnit.SECONDS.sleep 可以被阻断,并且抛出异常 InterruptedException

  如果要阻断IO 可以使用 System.out.close();

 

posted @   zz2108828  阅读(484)  评论(0)    收藏  举报
编辑推荐:
· 如何把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的三大决胜优势
点击右上角即可分享
微信分享提示