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

      输出:

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

     输出:

    1. Caught java.lang.InterruptedException: sleep interrupted

    可以得出:

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

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

  • 相关阅读:
    hdu1787GCD Again<欧拉函数>
    uva11300Spreading the Wealth<数学>
    Java基础之Calendar应用:每周三、六休息,从某个日期起至今休息多少天?
    Java基础之Runtime类
    Java基础之Calendar对象
    Java基础之集合转换为数组
    Java基础之数组转换为集合
    Java基础之高级(增强的)For循环(foreach)
    Java基础之Date对象的使用
    Java基础之可变参数
  • 原文地址:https://www.cnblogs.com/--zz/p/9657046.html
Copyright © 2020-2023  润新知