【发布时间】:2012-03-18 13:32:51
【问题描述】:
这可能是我只是误解了我所读到的内容,但是在 Java 中杀死线程的所有示例似乎都表明您必须向线程发出信号以杀死自己;如果没有一些严重的风险,你不能从外面杀死它。问题是,所有关于如何“礼貌地”要求线程终止的示例都有某种循环,因此您所要做的就是在每次迭代时观察一个标志。
所以,我得到的是一个线程,它只需要一段时间(一系列 SQL 查询)。我当然可以在每个步骤之后进行检查,但它们不在循环中,并且我知道没有一种非常优雅的方式来解决这个问题。这是我正在做的一个例子:
new Thread(new Runnable(){
public void run(){
//query 1
Connection conn = db.getConnection();
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT ...");
while(rs.next()){
//do stuff
}
//query 2
rs = s.executeQuery("SELECT ...");
while(rs.next()){
//do stuff
}
//query 3
rs = s.executeQuery("SELECT ...");
while(rs.next()){
//do stuff
}
}
}).start();
这是一个示例,我不使用匿名内部类,但它说明我的 run() 方法不能优雅地停止自身。此外,即使我在每一步后检查,如果特定查询需要很长时间才能运行,则此代码在查询完成之前将无法停止。
此代码用于 GUI 应用程序,我真的很想找到一种无需使用 Thread.stop() 即可快速终止线程的好方法。
编辑 - yshavit 的回答很有帮助,因为我不知道 Statement.cancel() 存在。如果您很好奇,我的特定问题的答案是构建一个更抽象的数据库访问类。该类必须创建一个子线程来执行查询并在它运行时循环,检查每次迭代是否当前线程(不是子线程)被中断。如果它确实被中断,它只是调用 Statement.cancel() 并且子线程将抛出异常并死亡。并非所有 JDBC 驱动程序都支持 Statement.cancel(),但 Oracle 11g 支持。
【问题讨论】:
-
你需要设置一个 volatile boolean 并检查它,或者检查线程是否被中断(并从另一个线程中断它以使其关闭)。
标签: java sql multithreading thread-safety