Это может быть случай, когда я просто неправильно понял то, что я прочитал, но все примеры уничтожения потока в 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 () не может элегантно остановить себя. Более того, даже после каждого шага я проверяю, выполняется ли определенный запрос очень долго, этот код не сможет остановиться до тех пор, пока запрос не будет завершен.
Этот код предназначен для приложения с графическим интерфейсом, и я действительно хотел бы найти хороший способ быстро завершить поток без использования Thread.stop ().
РЕДАКТИРОВАТЬ - ответ ишавита мне очень помог, так как я не знал, что Statement.cancel()
существует. Если вам интересно, ответом на мою конкретную проблему было создание более абстрактного класса доступа к базе данных. Класс должен был создать дочерний поток для выполнения запроса и цикла во время его выполнения, проверяя на каждой итерации, прерывается ли текущий поток (не дочерний). Если он прерывается, он просто вызывает Statement.cancel (), и дочерний поток генерирует исключение и умирает. Не все драйверы JDBC поддерживают Statement.cancel()
, но Oracle 11g поддерживает.