我开始了几个线程,但是我没有参考信号停止信号或某事.
例如,我不能像run = false这样的变量传递给这些线程,因为我没有他们的引用,而是有他们的名字.
例如,我不能像run = false这样的变量传递给这些线程,因为我没有他们的引用,而是有他们的名字.
我正在使用一个ThreadGroup,总是有它的参考.所以我可以做这样的事情.似乎是不行的.
Thread[] threads = new Thread[threadGroup.activeCount()]; int count = threadGroup.enumerate(threads); for(int i = 0; i < count; i++){ threads[i].interrupt(); }
这是我线程的示例.
public void run{ try{ //myDAO.getRecords(); //this takes 30seconds to 60 //returns about 3 millions of records }catch(Exception e){ //log } }
解决方法
对于等待查询输出的线程调用中断没有任何影响,因为大多数JDBC驱动程序都免受状态的影响.它仍将保持阻止,查询将继续执行.
调用cancel将使连接和线程在数据库中执行查询.一段时间,它是确定,但它也杀死了连接.这可能会造成严重问题,很快就会成为瓶颈.
一个替代但是一个工作的解决方案是获取执行过程/查询(在数据库端)的线程的ID并调用:
KILL QUERY id;
KILL QUERY terminates the statement that the connection is currently executing,but leaves the connection itself intact.
要知道ID,右在过程中,将第一行作为:SELECT CONNECTION_ID();.此Id可用于终止它.