zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    Linux Shell入门
    Linux系统结构
    Ubuntu bond 配置
    VXLAN概述
    lsof
    入驻博客园,希望可以跟大家一起讨论,一起学习和进步。
    版本管理工具小乌龟TortoiseGit的安装和使用(2)
    版本管理工具小乌龟TortoiseGit的安装和使用(1)
    定义变量时未初始化赋值的问题
    BlackBerry 9900刷机
  • 原文地址:https://www.cnblogs.com/--zz/p/9657046.html
Copyright © 2011-2022 走看看