请问java里不通过变量如何安全的强制杀一个线程?

时间:2022-09-23 18:13:21
情况是这样的,主线程是个gui,有个按钮点击后新开线程查数据库,计算等等操作。

这时gui还有个按钮是取消,点击取消可以停止刚才新开的查询等等操作,最直观的想法就是kill掉刚才新开的线程。

就像sql server的分析器里,query和cancel query两个按钮的功能一样。

主要是因为分线程过了N个方法,我总不能在走每一步都查一下某个变量看这个线程是否被interrupt了。

另外,不能用thread的stop方法。

有办法解决吗?谢谢各位大侠!

16 个解决方案

#1


引用楼主 windforcecn 的帖子:
情况是这样的,主线程是个gui,有个按钮点击后新开线程查数据库,计算等等操作。 

这时gui还有个按钮是取消,点击取消可以停止刚才新开的查询等等操作,最直观的想法就是kill掉刚才新开的线程。 

就像sql server的分析器里,query和cancel query两个按钮的功能一样。 

主要是因为分线程过了N个方法,我总不能在走每一步都查一下某个变量看这个线程是否被interrupt了。 

另外,不能用thread的stop方法。 

有办法解…

答:不能强杀,只能请求线程停止运行。

#2


顶一下

#3


CLOSE掉线程

#4


exit()不行吗?

#5


引用楼主 windforcecn 的帖子:
情况是这样的,主线程是个gui,有个按钮点击后新开线程查数据库,计算等等操作。 

这时gui还有个按钮是取消,点击取消可以停止刚才新开的查询等等操作,最直观的想法就是kill掉刚才新开的线程。 

就像sql server的分析器里,query和cancel query两个按钮的功能一样。 

主要是因为分线程过了N个方法,我总不能在走每一步都查一下某个变量看这个线程是否被interrupt了。 

另外,不能用thread的stop方法。 

有办法解…


你这个问题其实是一个关于如何中止线程的问题
其实线程无非是执行run方法,一旦run方法执行结束,该线程就结束了
所以你只要适当控制run方法的执行和结束就可以了

#6


还有,对你描述的问题偶有点不同的想法哦

1)你这个查询数据库需要开线程进行操作吗?
偶觉得你可以写一个方法,甚至是一个类专门用来做数据库查询
然后调用就好了。

2)为何要有取消的按钮呢
因为你这个查询只是简单的一个操作,不涉及改变数据的任何属性,
不像更新啊,新插入数据什莫的,为了避免数据不小心被改掉,还要使用事务处理的
但查询的,与修改的都无关阿,所以要取消干什莫呢

#7


谢谢各位。

另开线程后台运行是让用户可以在同时做其他操作。

取消是因为,查询完了还要计算什么什么的,很慢的,可以取消掉是为了防止误操作以省时间。

我的run里只有一个方法,这个方法call了N个其他的方法。

我如果要每个方法甚至每一步都查一个变量看此线程是否被interrupt,实在让偶很难接受啊。

#8


需要查看Interrupt么?你抛InterruptedException,用其来处理正常退出不就行了么。

#9


可以考虑下使其线程无效~

#10


是个问题,关注一下,目前没有好的建议

#11


AOP,直接匹配所有线程相关方法,每个方法调用前都得接受横切性检查。当前状态不合适就直接杀掉

#12


引用 11 楼 jeff2033333 的回复:
AOP,直接匹配所有线程相关方法,每个方法调用前都得接受横切性检查。当前状态不合适就直接杀掉


每个方法都检查。。。太多了

#13


引用 7 楼 windforcecn 的回复:
谢谢各位。

另开线程后台运行是让用户可以在同时做其他操作。

取消是因为,查询完了还要计算什么什么的,很慢的,可以取消掉是为了防止误操作以省时间。

我的run里只有一个方法,这个方法call了N个其他的方法。

我如果要每个方法甚至每一步都查一个变量看此线程是否被interrupt,实在让偶很难接受啊。


所以了,偶觉得你这个类的设计就有问题了
为什么要把查询和计算放到一起呢,又不是关联性很强的操作
建议单独做查询和计算

所以,如果单独查询的话,根本没有必要开线程
要知道线程是很开销系统资源的

再补充一点,线程一般用于服务器程序
比如说做监视,或者定时任务等。
一般不和用户的操作行为做交互

#14


......

先谢谢,并非仅仅查询数据库

用户点击操作以后要返回查询完并计算好的结果返回

如果要用户输入参数以后,点查询,完了再点计算,实在是太不友好。

另外,说了开线程是因为用户还可以对界面有其他操作,例如查询另外的数据

#15


强行干掉一个线程,貌似不科学。
楼主试试,调用一下Connection的rollback方法,或者close方法。
理论上来讲,调用rollback方法,可以中断数据库的当前操作,并释放数据库相应的锁。

楼主可以参照查询分析器的使用,看看能否中断当前的操作。
毕竟,查询分析器,也不是所有情况,都能及时响应滴。

#16


失误了,不是Connection的rollback方法,而是Statement的cancel方法。

#1


引用楼主 windforcecn 的帖子:
情况是这样的,主线程是个gui,有个按钮点击后新开线程查数据库,计算等等操作。 

这时gui还有个按钮是取消,点击取消可以停止刚才新开的查询等等操作,最直观的想法就是kill掉刚才新开的线程。 

就像sql server的分析器里,query和cancel query两个按钮的功能一样。 

主要是因为分线程过了N个方法,我总不能在走每一步都查一下某个变量看这个线程是否被interrupt了。 

另外,不能用thread的stop方法。 

有办法解…

答:不能强杀,只能请求线程停止运行。

#2


顶一下

#3


CLOSE掉线程

#4


exit()不行吗?

#5


引用楼主 windforcecn 的帖子:
情况是这样的,主线程是个gui,有个按钮点击后新开线程查数据库,计算等等操作。 

这时gui还有个按钮是取消,点击取消可以停止刚才新开的查询等等操作,最直观的想法就是kill掉刚才新开的线程。 

就像sql server的分析器里,query和cancel query两个按钮的功能一样。 

主要是因为分线程过了N个方法,我总不能在走每一步都查一下某个变量看这个线程是否被interrupt了。 

另外,不能用thread的stop方法。 

有办法解…


你这个问题其实是一个关于如何中止线程的问题
其实线程无非是执行run方法,一旦run方法执行结束,该线程就结束了
所以你只要适当控制run方法的执行和结束就可以了

#6


还有,对你描述的问题偶有点不同的想法哦

1)你这个查询数据库需要开线程进行操作吗?
偶觉得你可以写一个方法,甚至是一个类专门用来做数据库查询
然后调用就好了。

2)为何要有取消的按钮呢
因为你这个查询只是简单的一个操作,不涉及改变数据的任何属性,
不像更新啊,新插入数据什莫的,为了避免数据不小心被改掉,还要使用事务处理的
但查询的,与修改的都无关阿,所以要取消干什莫呢

#7


谢谢各位。

另开线程后台运行是让用户可以在同时做其他操作。

取消是因为,查询完了还要计算什么什么的,很慢的,可以取消掉是为了防止误操作以省时间。

我的run里只有一个方法,这个方法call了N个其他的方法。

我如果要每个方法甚至每一步都查一个变量看此线程是否被interrupt,实在让偶很难接受啊。

#8


需要查看Interrupt么?你抛InterruptedException,用其来处理正常退出不就行了么。

#9


可以考虑下使其线程无效~

#10


是个问题,关注一下,目前没有好的建议

#11


AOP,直接匹配所有线程相关方法,每个方法调用前都得接受横切性检查。当前状态不合适就直接杀掉

#12


引用 11 楼 jeff2033333 的回复:
AOP,直接匹配所有线程相关方法,每个方法调用前都得接受横切性检查。当前状态不合适就直接杀掉


每个方法都检查。。。太多了

#13


引用 7 楼 windforcecn 的回复:
谢谢各位。

另开线程后台运行是让用户可以在同时做其他操作。

取消是因为,查询完了还要计算什么什么的,很慢的,可以取消掉是为了防止误操作以省时间。

我的run里只有一个方法,这个方法call了N个其他的方法。

我如果要每个方法甚至每一步都查一个变量看此线程是否被interrupt,实在让偶很难接受啊。


所以了,偶觉得你这个类的设计就有问题了
为什么要把查询和计算放到一起呢,又不是关联性很强的操作
建议单独做查询和计算

所以,如果单独查询的话,根本没有必要开线程
要知道线程是很开销系统资源的

再补充一点,线程一般用于服务器程序
比如说做监视,或者定时任务等。
一般不和用户的操作行为做交互

#14


......

先谢谢,并非仅仅查询数据库

用户点击操作以后要返回查询完并计算好的结果返回

如果要用户输入参数以后,点查询,完了再点计算,实在是太不友好。

另外,说了开线程是因为用户还可以对界面有其他操作,例如查询另外的数据

#15


强行干掉一个线程,貌似不科学。
楼主试试,调用一下Connection的rollback方法,或者close方法。
理论上来讲,调用rollback方法,可以中断数据库的当前操作,并释放数据库相应的锁。

楼主可以参照查询分析器的使用,看看能否中断当前的操作。
毕竟,查询分析器,也不是所有情况,都能及时响应滴。

#16


失误了,不是Connection的rollback方法,而是Statement的cancel方法。