处理不可中断的阻塞

    xiaoxiao2022-07-12  141

    前言:

    我们知道可阻塞的方法都是通过提前返回或者抛出InterruptedException来响应中断请求的,从而使开发人员更容易构建出能响应取消请求的任务,那么不可中断的阻塞方法该如何处理呢?

       不可中断阻塞的情况一般有以下几种:

    java.io包中的同步Socket I/Ojava.io包中的同步I/OSelector的异步I/O获取某个锁

    主要关键在于:继承thread类 重写原来中断线程或者取消任务的方法,在方法里面加入自己的取消操作,比如关闭数据流,关闭套接字等,然后再调用父类的中断方法,这样就可以既关闭了阻塞的任务,又中断了线程。

    举例子

    public class ReaderThread extends Thread { private static final int BUFSZ = 1024; private final Socket socket; private final InputStream in; public ReaderThread(Socket socket) throws IOException { this.socket = socket; this.in = socket.getInputStream(); } // 覆盖Thread类的interrupt方法, 加入关闭socket的代码 // 如果发生中断时, 线程阻塞在read方法上, socket的关闭会导致read方法抛出SocketException, 然后run方法运行完毕 public void interrupt() { try { socket.close(); } catch (IOException ignored) { } finally { super.interrupt(); } } public void run() { try { byte[] buf = new byte[BUFSZ]; while (true) { int count = in.read(buf); if (count < 0) break; else if (count > 0) processBuffer(buf, count); } } catch (IOException e) { /* Allow thread to exit */ } } private void processBuffer(byte[] buf, int count) { //... } }

    参考文档:

    https://blog.csdn.net/xingxing_zhang/article/details/84181169

     

    最新回复(0)