我一直在阅读很多关于停止线程的信息,但我无法找到解决我的问题的方法:
我有一个连接了 3 个线程的 Sybase DB 连接。加上一个线程来监视这 3 个线程。
然而,因为服务器超载(我知道:我应该解决这个问题,但我们还没有钱),调用:Statement stmt.executeUpdate("update something from some_table"); 永远不会回来。
这是线程大致执行的操作(不可编译,因为它无论如何都不可重现):
class runQuery implements Runnable {
public Connection conn;
public long lastQueryRunTime = 0;
public Statement stmt;
public volatile keepongoing = true;
runQuery(Connection conn, String Probe, String Server, int thisthread) {
this.conn = conn;
Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
conn = DriverManager.getConnection("jdbc:sybase:Tds:"+Server+":4100?SERVICENAME="+Probe,"login","password");
}
public void run () {
while(keepongoing) {
query = "update something from some_table";
lastQueryRunTime = System.currentTimeMillis()/1000;
stmt = conn.createStatement();
stmt.setQueryTimeout(4);
int result = stmt.executeUpdate(query);
lastQueryRunTime = 0;
}
}
这应该给出一个粗略的想法。另一方面,我有一个“MonitorThemAll”线程来检查 lastQueryRunTime:如果它太长,我想......做点什么!
因此,从监控线程中,我尝试过:更改 keepongoing 标志 ...但由于线程卡在更新查询中,它并没有做太多然后:stmt.cancel(), stmt.close() =>它似乎没有多大作用。执行 kill -3 表明线程仍然停留在 executeUpdate 行上。
我转向更有力的解决方案: conn.close() => 从那里开始,每次尝试 stmt.cancel/close 时都会出现异常“JZ0C0:连接已关闭”(这些异常是由 stmt.cancel/close 命令引发的: 即:它们在 MonitorThemAll 线程中,而不是在 runQuery 线程中......)而且:mythread.interrupt() => 之后仍然停留在更新查询中!
我在这里和谷歌上找到的解决方案已经用完了......因为 thread.close() 已被弃用(即使,我想避免,以便我可以恢复所使用的资源),我不知道我还能尝试什么...
会有人知道要尝试的事情吗?