Java多线程之阻塞I/O如何中断 您所在的位置:网站首页 阻塞中断 Java多线程之阻塞I/O如何中断

Java多线程之阻塞I/O如何中断

2023-03-22 21:37| 来源: 网络整理| 查看: 265

Java多线程之阻塞I/O如何中断 转载

mb5fdcaee2972df 2014-05-27 23:08:00

文章标签 java .net sed ide 中断阻塞 文章分类 Java 后端开发

阻塞的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; } @Override public 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多线程之生存者与消费者(Java编程思想)

下一篇:Java多线程之线程结束清理



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有