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

解决方案 »

  1.   

    boolean flag = ture  
    do
    {
    doSomething() ;
    }
    while( flag )
      

  2.   

    要跳出doSomething(),就要在doSomething()里面想办法.
      

  3.   

    doSometing()里耗时的一句就是
    Result rs = statement.executeQuery()这一句在执行查询,程序就在这一直在运行。但并不是阻塞。
    有什么办法能在这一句终止。
      

  4.   

    不能取消,除非在查询之前设定 setQueryTimeout 时间。不设定的话将会一直阻塞下去,直到达到默认的超时间。有一种理念需要扶正一下,所有的线程级别都是一样的,并不存在谁控制谁的问题,主线程也没有更多的权力去控制子线程的状态。只要子线程在执行了,是不能中断的。主线程可以使用 Thread#interrupt() 中断某个线程,但是这个线程是否会中断,或者何时中断都是无法控制的。
      

  5.   

    主线程可以使用 Thread#interrupt() 中断某个线程,但是这个线程是否会中断,或者何时中断都是无法控制的。
    你说的不对,interrupt()中是将正在阻塞的线程中断,不再继续阻塞,如调用了wait() sleep()的线程。但线程还是会执行完的。
      

  6.   

    嗯,是的 interrupt 是中断阻塞的线程。但是数据库操作底层是 Socket 连接的,向数据库服务端发出请求后,JDBC 的客户端就会在那里阻塞着,直到数据库服务器的响应过来了。
      

  7.   

    其实中断jdbc操作是不常见的操作,所以不如控制界面,让用户感觉不到后台在继续操作。
      

  8.   

    我很清楚的测试过,interrupt 中断不了 statement.executeQuery()
      

  9.   

    查到一个Statement里的方法 cancel()
    一个线程可以使用此方法结束别一个线程正在执行的语句。
      

  10.   

    如果线程正在使用你去停止会出异常的.但是功能确实可以实现
     ExecutorService executorService = Executors.newCachedThreadPool();
               executorService.execute(new Thread()
               {
                   public void run()
                   {
                       try
                       {
                           System.out.println("线程等待");
                           Thread.sleep(100000000);
                       }
                       catch (InterruptedException e)
                       {
                           e.printStackTrace();
                       }
                   }
                  });
               
               System.out.println("线程停止!1");
               request.getSession().setAttribute("lzw", executorService);
            ExecutorService  executorService= (ExecutorService) request.getSession().getAttribute("lzw");
            executorService.shutdownNow();
    实在不行可以考虑使用异步线程
      

  11.   

    你可以在另一个线程里面对同一个Statement对象,调用Statement.cancel()方法具体可以看  http://onjava.com/pub/a/onjava/2004/06/16/dbcancel.html