Остановка нециклического потока Java

Это может быть случай, когда я просто неправильно понял то, что я прочитал, но все примеры для уничтожения потока в 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 ().

РЕДАКТИРОВАТЬ - ответ yshavit мне очень помог, так как я не знал, что существует Statement.cancel () . Если вам интересно, ответом на мою конкретную проблему было создание более абстрактного класса доступа к базе данных. Класс должен был создать дочерний поток для выполнения запроса и цикла во время его выполнения, проверяя на каждой итерации, был ли прерван текущий поток (не дочерний). Если он прерывается, он просто вызывает Statement.cancel (), и дочерний поток генерирует исключение и умирает. Не все драйверы JDBC поддерживают Statement.cancel () , но Oracle 11g поддерживает.

7
задан monitorjbl 17 December 2015 в 20:22
поделиться