---恢复内容开始---
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();