I/O 阻塞 中断的注意点

Posted --zz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();

 

以上是关于I/O 阻塞 中断的注意点的主要内容,如果未能解决你的问题,请参考以下文章

:Linux设备驱动中的异步通知与同步I/O

操作系统-IO零拷贝

操作系统-IO零拷贝

操作系统-IO零拷贝

Unix的五种I/O模型

Unix的五种I/O模型