有两个线程,一个用于查询,查询可能很慢,所以,第二个线程就是用来停掉第一个查询线程。第二个线程内调用第一个线程thread.interrupt();
但是之后第一个线程还是能继续执行下去。请教为何?如果停第一个,第一次用多线程,谢谢大家指点

解决方案 »

  1.   

    thread.interrupt(); 
    只是使它从wait\sleep等状态中醒过来并抛出一个错误一般来说,我们不会无条件终止一个线程,因为那样做是很不安全的,我们会在线程的循环量中设置一个boolean变量,设置这个变量为false来达到终止这个线程的目的如果你一定要无条件终止这个线程,那么用destroy()方法吧.
      

  2.   

    JDBC 不是你这么用的,如果你的 JDBC 驱动支持 Statement.setQueryTimeout(int seconds) 此方法,那直接用它设置查询超时时间多简单。以下摘自 JDK API 文档:
    void setQueryTimeout(int seconds) throws SQLException
    将驱动程序等待 Statement 对象执行的秒数设置为给定秒数。如果超过该限制,则抛出 SQLException。JDBC 驱动程序必须将此限制应用于 execute、executeQuery 和 executeUpdate 方法。JDBC 驱动程序实现也可以将此限制应用于 ResultSet 方法(有关详细信息,请参考驱动程序供应商文档)。 
    参数:
    seconds - 以秒为单位的查询超时限制;0 表示没有任何限制 
    抛出:
    SQLException - 如果发生数据库访问错误,在已关闭的 Statement 上调用此方法,或者不满足条件 seconds >= 0
      

  3.   

    谢谢大家,
    我的目的并不是因为查询速度或者超时。因为我的前台查询是多线程的:点查询按钮调用后台查询服务,点取消按钮可以取消前台的查询进程(前台是C++的,通过C++BUILDER可以实现直接停前台的查询进程)。这样就有一个问题:前台的查询停止后台的却仍旧工作,如果很多用户在很多前台上一直不停地点“查询”、“停止”,后台会一直产生新的调用服务并运行,内存不够可能会挂掉。这个比查询慢或超时更重要。回3楼的同学:destroy()是没有函数体的,这个方法没用的所以最好能有个能直接干掉Runnable.run()的方法^_^国庆快乐!
      

  4.   


    要直接“干掉”线程,那用 Thread.stop() 吧,如果处理不好后果很严重,慎用。
      

  5.   


    这个方法已经废弃了,看样子跑到run()里面就做不掉了