設置了線程中斷,中斷標識不起效
功能要求:后台單獨開一個線程啟動一個長時間的耗時任務,支持中途中斷
問題:在取消任務的請求邏輯中,通過interrupt()設置線程終止,然后在耗時任務通過isInterrupted()判斷中斷信息,然而isInterrupted()返回的一直是FALSE
異常:在后台日志中,看到有oracle驅動相關的異常
Caused by: java.io.InterruptedIOException: Socket read interrupted
at oracle.net.nt.TimeoutSocketChannel.handleInterrupt(TimeoutSocketChannel.java:549)
at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:420)
at oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:1119)
at oracle.net.ns.NIOPacket.readHeader(NIOPacket.java:267)
at oracle.net.ns.NIOPacket.readPacketFromSocketChannel(NIOPacket.java:199)
at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:141)
at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:114)
at oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:98)
at oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:834)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:487)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:622)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:299)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:498)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:152)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:937)
... 24 common frames omitted
猜測是否是由於oracle驅動使用Thread.interrupted()判斷,一排查,發現確實是:

這里把中斷標識清了,導致我后面判斷一直不成功,最后我只想說:我服辣!
