回答

收藏

停止非循环Java线程

技术问答 技术问答 271 人阅读 | 0 人回复 | 2023-09-14

这可能是我误读了我读的内容,但在Java杀死线程的所有示例似乎都表明你必须发出杀死自己的信号。你不能在没有严重风险的情况下从外面杀死它。问题是,所有关于如何礼貌要求线程死亡的示例都有一定的循环,所以你所要做的就是观察每次迭代中的标志。4 Z  [4 s. E3 _: D9 K
因此,我得到的是一个线程,它只需要一段时间(一系列SQL查询)。当然,我可以在每一步之后检查,但它们不在循环中,我没有一个非常优雅的方法来解决这个问题。这是我正在做的一个例子:$ h& D3 o% ~% U+ f2 I
new Thread(new Runnable(){     public void run(){         //query                 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()方法不能优雅地停止自己。此外,即使我在每一步之后检查,如果特定的查询需要很长时间才能运行,代码也不会在查询完成后停止。
+ i" p, P. A* [6 Y  a5 I4 V这个代码是针对的GUI我真的很想找到一个不需要使用的应用程序Thread.stop()快速杀死线程的好方法。
7 p$ R0 m( F. |  \编辑; a* x$ L& e4 I/ v# @$ z3 t# V
-yshavit答案很有帮助,因为我不知道Statement.cancel()存在。如果你好奇的话,我具体问题的答案是建立一个更抽象的数据库访问类别。在运行过程中,必须创建一个子线程进行查询和循环,并检查每次迭代是否中断当前线程(而不是子线程)。如果确实中断,只会调用Statement.cancel(),子线程会导致异常和死亡。不是所有的JDBC支持所有驱动程序Statement.cancel(),但是Oracle
4 ~% f% z$ R1 {9 N' _0 v. Q4 {11g支持。' p7 C: ^% T; f( K7 z" C$ S# V
                                                               
5 V' Z4 ?6 Y- G; V8 q    解决方案:                                                                , }" c+ Y9 H0 S5 W
                                                                找出需要一些时间的情况,然后将其取消。如果最耗时的事情是rs.next()循环可执行以下操作:
0 Z0 f" s8 h* K8 [5 twhile(rs.next(){     if (myVolatileBooleanSaysToStop)              return; // or whatever    do stuff}如果你需要花一些时间些时间JDBC支持驱动程序/服务器Statement.cancel,然后你可以发布你的内容Statement负责第二线程Statement.cancel适当的调用。我不确定,但我认为这会导致SQLException产生驱动程序a8 l! E" \4 I/ d2 [& f
,然后你可以以某种方式将其标记为取消并相应处理。
4 v: T# H) F* @: p; b另外,你应该考虑重建。您可以将三个运行查询,遍历其结果块放入一种方法中(然后关闭处理句等)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则