设置了线程中断,中断标识不起效

设置了线程中断,中断标识不起效

功能要求:后台单独开一个线程启动一个长时间的耗时任务,支持中途中断

问题:在取消任务的请求逻辑中,通过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()判断,一排查,发现确实是:

这里把中断标识清了,导致我后面判断一直不成功,最后我只想说:我服辣!

posted @ 2022-01-20 13:46  冰肌玉骨小香脐  阅读(1086)  评论(0编辑  收藏  举报