I/O 阻塞 中断的注意点
---恢复内容开始---
shutdownNow() 方法:
将向所有由ExecutorService 启动的任务发送 interrupt().进行阻断.
但是只有任务进入到一个 (可中断的) 阻塞操作时,
这个中断才会抛出 InterruptedExceptoin 异常.
需要注意的是:
[ I/O ] 和 [ synchronized 块上的等待 ] 是不可以中断的,只有通过关闭底层资源进行中断
所以在 创建I/O 任务的时候, 这意味着 I/O 具有锁住你的多线程程序的现在可能,
特别是对于基于 Web的程序. 但是nio 类的 I/O 是会自动响应中断的.
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() 放到最前面
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();