问题描述:想要合理终止一个线程。目前有一个数据库查询方法 doSomething() ;耗时很久。
想在界面上做一个按钮,在查询过程中可以取消查询。
于是我开启了一个线程来执行doSomething()查询。
但是无法终止线程尝试方法
1 stop(),方法不安全,已经过时,而且调用之后正在执行数据查询中会抛出SqlException2 isInterrupted() 
doSometing()里耗时的一句就是
Result rs = statement.executeQuery()这一句在执行查询,程序就在这一直在运行。但并不是阻塞。3 使用线程标记,代码如下,这样做doSomething至少要执行一次,其实我也只是要让他执行一次就够了,而终止操作是希望在一次执行之中。
   
boolean flag = ture  
while( flag )
{
doSomething() ;
}
希望各位给出合适的方案

解决方案 »

  1.   

    你是不是数据库中数据量很大,只需要查一部分数据出来,所以才要终止的,可以优化你的SQL,之查前N条记录不就好了!
      

  2.   

    线程的调度主要是wait()和notify()方法,如果要终止线程,我觉得应该另外写一个dispose方法,毕竟你的ResultSet什么的都还没有关闭,点击按钮时直接执行dispose方法,这个方法执行完线程也就结束了,没必要强制关掉,否则容易引起数据库connection回收问题
      

  3.   

    wait()与notify()很显明不适合现在这种情况。
    难不成你要阻塞我的查询线程吗我明白直接stop肯定会带来问题。
      

  4.   


    强烈建议,在表中建索引,优化SQL,我对线程不是很精通,但是觉得人为终止线程,不太合理。
      

  5.   

    doSometing()里耗时的一句就是
    Result rs = statement.executeQuery()这一句在执行查询,程序就在这一直在运行。但并不是阻塞。---
    这个保存起statement对象,在另外一个线程可以调用statement.cancel()中止SQL语句的支持(需要数据库本身支持)
      

  6.   

    3 使用线程标记,代码如下,这样做doSomething至少要执行一次,其实我也只是要让他执行一次就够了,而终止操作是希望在一次执行之中。
       
    boolean flag = ture  
    while( flag )
    {
    doSomething() ;
    }
    doSomething()应该可以拆分吧?在中间用Flag判断是否break