阻塞的I/O线程在关闭线程时并不会被打断,需要关闭资源才能打断。

1.执行socketInput.close();阻塞可中断。2.执行System.in.close();阻塞没有中断。
package Thread.Interrupting;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class CloseResource {public static void main(String[] args) throws Exception {//堵塞的I/O线程不会被打断,需要关闭资源才能打断ExecutorService exec = Executors.newCachedThreadPool();ServerSocket server = new ServerSocket(8080);InputStream socketInput = new Socket("localhost", 8080).getInputStream();exec.execute(new IOBlocked(socketInput));exec.execute(new IOBlocked(System.in));TimeUnit.MILLISECONDS.sleep(100);System.out.println("Shutting down all threads");exec.shutdownNow();TimeUnit.SECONDS.sleep(1);System.out.println("Closing " + socketInput.getClass().getName());socketInput.close();TimeUnit.SECONDS.sleep(1);System.out.println("Close " + System.in.getClass().getName());System.in.close();}
}

被阻塞的nio通道在关闭线程后会自动响应中断阻塞,不需要关闭底层资源。
package Thread.Interrupting;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousCloseException;
import java.nio.channels.ClosedByInterruptException;
import java.nio.channels.SocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;class NIOBlocked implements Runnable {private final SocketChannel sc;public NIOBlocked(SocketChannel sc) {this.sc = sc;}@Overridepublic void run() {try {System.out.println("Waiting for read() in " + this);sc.read(ByteBuffer.allocate(1));} catch (ClosedByInterruptException e) {System.out.println("ClosedByInterruptException");} catch (AsynchronousCloseException e) {System.out.println("AsynchronousCloseException");} catch (IOException e) {throw new RuntimeException(e);}System.out.println("Exiting NIOBlocked.run() " + this);}}public class NIOInterruption {public static void main(String[] args) throws Exception {//被阻塞的nio通道会自动地响应中断ExecutorService exec = Executors.newCachedThreadPool();ServerSocket server = new ServerSocket(8080);InetSocketAddress isa = new InetSocketAddress("localhost", 8080);SocketChannel sc1 = SocketChannel.open(isa);SocketChannel sc2 = SocketChannel.open(isa);Future<?> f = exec.submit(new NIOBlocked(sc1));exec.execute(new NIOBlocked(sc2));exec.shutdown();TimeUnit.SECONDS.sleep(1);f.cancel(true);TimeUnit.SECONDS.sleep(1);sc2.close();}}

Java多线程之阻塞I/O如何中断相关推荐

  1. Java多线程_阻塞队列

    1.什么是阻塞队列        我们知道,PriorityQueue.LinkedList这些都是非阻塞队列.在我们使用非阻塞队列的时候有一个很大问题,它不会对当前线程产生阻塞,那么在面对类似消费者 ...

  2. JAVA多线程--线程阻塞与唤醒

    方式1:早期JAVA采用suspend().resume()对线程进行阻塞与唤醒,但这种方式产生死锁的风险很大,因为线程被挂起以后不会释放锁,可能与其他线程.主线程产生死锁,如: public cla ...

  3. Java多线程_JUC包下的阻塞队列

    在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueu ...

  4. JAVA多线程之中断机制(如何处理中断?)

    一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且 ...

  5. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  6. 如何查找历史线程阻塞原因_吊打面试官!Java多线程并发 108 道题,你能答对多少?...

    多线程并发108题 1.Java中实现多线程有几种方法 2.继承Thread 类 3.实现Runnable 接口. 4.ExecutorService. Callable. Future 有返回值线程 ...

  7. Java多线程(七)——线程中断

    目录 一.引言 二.stop与interrupt 三.非阻塞线程被interrupt 四.阻塞线程被interrupt 五.总结 一.引言 线程中断在开始没有特别重视,多线程往后学习才发现线程中断也是 ...

  8. Java多线程基础-9:代码案例之阻塞队列

    阻塞队列是一种特殊的队列,带有"阻塞特性",也遵守队列 "先进先出" 的原则.阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻 ...

  9. JAVA多线程-常用JUC工具类及阻塞队列

    工具类 CountDownLactch 简述 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成,同步辅助. CountDownLatch 类用给定的计数初始化. await 方法阻塞,直到由 ...

最新文章

  1. IoC容器总结与简单模拟
  2. 使用训练数据结构代替注意力机制之训练一个小说
  3. 路由表及路由的选择算法
  4. php smarty 时间,smarty的时间格式-详细 | 时刻需
  5. 优秀的Java开发人员必备的6个技能
  6. 7招,实现安全高效的流水线管理
  7. 微软再出手!这次要干翻 IDEA 了。。
  8. orm2 中文文档 8. 聚合
  9. matlab 中 diff 函数 cumsum 函数 logical 函数 tabulate 函数 使用方法
  10. 个人经验分享:AD绘制PCB(入门教程)
  11. 电脑无限重启 服务器,电脑开机无限蓝屏重启怎么办
  12. matlab中isequal函数,MATLAB中的isequal函数的用法
  13. 为什么电脑不能安全关闭计算机,电脑无法正常关机的原因以及解决办法
  14. java 穷举_java循环穷举
  15. 722 | Crypto Tech Night第五期分享会,参会通道开放中
  16. stm32f407 休眠模式_STM32进入和退出睡眠模式
  17. Statement接口的基本介绍和使用
  18. PIXHAWK飞控的外部控制
  19. 清华大学计算机考研经历,从普通一所大学考研到清华有多难?
  20. Linux Watchdog/看门狗

热门文章

  1. 人工神经网络研究的发展及特性,以前不叫人工智能
  2. jupyter写python的时候换行总是换到下一行的中间
  3. 观点|重磅出炉!29页《业内观点:机器人行业的未来》
  4. 当AI主播和人越来越像,我们该怎么办?
  5. 3D原子映射有助于研究生命的起源
  6. 宇宙膨胀背后的故事(卅三):宇宙之有生于无
  7. 四大运营商的5G部署路线一览
  8. 院士张钹:AI奇迹短期难再现 深度学习技术潜力已近天花板
  9. a16z基金:顶级风投眼中的2019技术趋势
  10. 当钢铁直男去应聘...... | 每日趣闻