首先杀掉线程,不能用stop,信息请看JDK的文档说明。这里简单总结有2点:
1:关闭会导致线程中释放所有锁,这样不能保证其它线程用到的锁对象是完整的或逾期的。
2:stop让处理程序静悄悄的结束,没办法做一些后处理。
官方推荐采用interrupt,同时也带来了问题,在阻塞的情况,不太好处理。
这里先对各种阻塞做下罗列测试。
Thread.sleep(1 * 1000); OK java.lang.InterruptedException
this.wait(); OK java.lang.InterruptedException
System.in.read(); 不可以停止,线程还照样存活
synchronized 如果代码出现死锁,就是出现对方互相等待,不会停止
数据库出现长时间的锁 不会停止
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Packet.java:282)
oracle.net.ns.DataPacket.receive(DataPacket.java:103)
oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230)
oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122)
oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78)
oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179)
oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155)
oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279)
oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)
- 已锁定 oracle.jdbc.driver.T4CConnection@289d2e
oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
thread.ThreadTest$jdbcTest.add(ThreadTest.java:296)
thread.ThreadTest$jdbcTest.tLock(ThreadTest.java:313)
thread.ThreadTest$2.run(ThreadTest.java:59)
这里是数据库锁的线程堆栈,也就是如果数据库锁了, interrupt 线程,是没反应的。
这种情况只能通过jdbc超时设置来处理。setQueryTimeout 注意这里秒为单位。
代码出现死锁说明是程序的bug,应该调整逻辑来处理。
总得来说,interrupt对杀掉线程更加轻量级,仅仅通过一个表示来控制。把控制权尽可能的让程序自身处理,
从而保证数据的一致性及线程的安全性。