Java 杀掉线程

首先杀掉线程,不能用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对杀掉线程更加轻量级,仅仅通过一个表示来控制。把控制权尽可能的让程序自身处理,

从而保证数据的一致性及线程的安全性。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值