Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поток не останавливается после того, как вызывает метод / 16 сообщений из 16, страница 1 из 1
21.11.2016, 18:11
    #39351332
Сергей_ТВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public void run() {
    	flag = true;
    	while(!Thread.currentThread().isInterrupted() && flag){
    		prokladka();
    	}
    }
    
	private void prokladka(){
		try {
            Thread.sleep(10000);
            potok ();
    	
        } catch (InterruptedException e) {
        	System.out.println("Поток прерван");
            flag = false;
           
        }
	}



Если вызываю interrupt() в течении 10 секунд пока поток спит, поток прерывается. После 10 сек начинается продолжительная выборка из MySQL. И если в это время вызвать interrupt(), то поток не останавливается. Что надо сделать, чтобы он остановлся (прервался)?
...
Рейтинг: 0 / 0
21.11.2016, 18:16
    #39351338
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Сергей_ТВ,

Почему вы не жалеете глаз читателей и не форматируете год?
С одной стороны JDBC выборка в большинстве случаев это банальная блокировка на сокете, которая должна выкидывать InterruptedException.
С другой стороны у JDBC есть штатные методы прерывкания, такие как Statement.cancel() и setQueryTimeout().
...
Рейтинг: 0 / 0
21.11.2016, 18:25
    #39351348
Сергей_ТВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Не понял смысл первой строки "Почему вы не жалеете глаз читателей и не форматируете год?"
...
Рейтинг: 0 / 0
21.11.2016, 18:33
    #39351360
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
А вообще ... Примите как данность, что попытки прерывать запросы к базе - череповаты.
Иногда - крайне череповаты. Например - будете ждать дольше, чем если бы запрос отработал до конца.
...
Рейтинг: 0 / 0
21.11.2016, 18:52
    #39351383
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Сергей_ТВНе понял смысл первой строки "Почему вы не жалеете глаз читателей и не форматируете год?"
"Код", а не "год". Голова уже под вечер за руками не успевает.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public void run() {
    flag = true;
    while(!Thread.currentThread().isInterrupted() && flag){
        wrapper();
    }
}
    
private void wrapper(){
    try {
        Thread.sleep(10000);
        databaseAccessTask();    	
    } catch (InterruptedException e) {
        System.out.println("Поток прерван");
        flag = false;           
    }
}
...
Рейтинг: 0 / 0
21.11.2016, 19:10
    #39351395
Сергей_ТВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Про код-год понятно. Видимо нажал на src-> java , а текст при этом не выделил...
Буду внимательнее.
...

По сути вопроса понял, что если все работает, и к этому подключаешь нечто и все работать перестает, то скорее всего причина в нечтом....
мдаа, глубокая и полезная мысль

Спасибо за ответы
...
Рейтинг: 0 / 0
21.11.2016, 19:25
    #39351409
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Сергей_ТВ,
В потоке проверять флаг в цикле. Который выставляется снаружи потока.
...
Рейтинг: 0 / 0
22.11.2016, 06:25
    #39351555
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Сергей_ТВ
Если вызываю interrupt() в течении 10 секунд пока поток спит, поток прерывается. После 10 сек начинается продолжительная выборка из MySQL. И если в это время вызвать interrupt(), то поток не останавливается. Что надо сделать, чтобы он остановлся (прервался)?
Thread#stop, в finally освобождать ресурсы. Может даже jdbc драйвер сумеет их корректно освободить, может даже всегда. (Я бы конечно на это надеяться не стал)))

Поле flag не имеет гарантий видимости (если работать с ним из разных потоков). Да и вообще смысла не имеет (как видно из представленного когда).

Если 'продолжительная выборка' - это чтение из резалтСета в цикле, то вот в этом самом цикле можно проверять не захотели-ли поток прервать извне (можно не на каждой итерации).
...
Рейтинг: 0 / 0
22.11.2016, 09:08
    #39351590
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
avp.mk,
Конечно, я и намекал на смысл остановки потока раньше выполнения им задачи.
И не только я.
Можно и комп выключать тремя клавишами, и вилкой из розетки.
...
Рейтинг: 0 / 0
22.11.2016, 09:21
    #39351597
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
avp.mk,
Ну а про флаг и его видимость, то он вроди во всех потоковых наследниках есть из коробки. Иначе зачем они нужны?
Там даже прогресс бар есть)) LOL.
...
Рейтинг: 0 / 0
22.11.2016, 10:24
    #39351628
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
avp.mkThread#stop
Really? То-то его в Java 9 собираются из просто @Deprecated перевести в @Deprecated(forRemoval=true)
...
Рейтинг: 0 / 0
22.11.2016, 10:40
    #39351644
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Blazkowiczavp.mkThread#stop
Really?avp.mkМожет даже jdbc драйвер сумеет их корректно освободить, может даже всегда. ( Я бы конечно на это надеяться не стал )))
Nope)

Blazkowiczavp.mkThread#stop
Really? То-то его в Java 9 собираются из просто @Deprecated перевести в @Deprecated(forRemoval=true)
А вот это правда жаль. Хотя наверное позволит ускорить JVM.
...
Рейтинг: 0 / 0
22.11.2016, 10:46
    #39351650
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
Petro123avp.mk,
Ну а про флаг и его видимость, то он вроди во всех потоковых наследниках есть из коробки.
Сергей_ТВ public void run() {
flag = true;
while(!Thread.currentThread().isInterrupted() && flag){
prokladka();
}
}

private void prokladka(){
try {
Thread.sleep(10000);
potok ();

} catch (InterruptedException e) {
System.out.println("Поток прерван");
flag = false;

}
}
Поле, говорю, это не нужно и к тому же имеет дефект.
...
Рейтинг: 0 / 0
22.11.2016, 10:49
    #39351652
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
avp.mk( Я бы конечно на это надеяться не стал ))
да. Я это видел и согласен с тобой).
У меня в JavaFX интересная штука в связи с этим.
Я стартанул поток минут на 50 по клавише Выполнить из Eclipse.
Потом, по середине работы закрыл приложение.
А поток вроде как работает и продолжает выбрасывать в консоль результаты.
Вот, например, в приложениях.exe такое закрытие полностью освободит память и все процессы-потоки-рессурсы связанные с этим главным окном.
AFAIK
...
Рейтинг: 0 / 0
22.11.2016, 10:54
    #39351660
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
avp.mkПоле, говорю, это не нужно и к тому же имеет дефект.
а тут разве не поле? Я говорил о наследниках.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
             int iterations;
             for (iterations = 0; iterations < 100000; iterations++) {
               if (isCancelled()) { 
                     break;
                 }
                 System.out.println("Iteration " + iterations);
             }
             return iterations;
         }
     };
 
...
Рейтинг: 0 / 0
22.11.2016, 15:27
    #39351926
Сергей_ТВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не останавливается после того, как вызывает метод
avp.mkPetro123avp.mk,
Ну а про флаг и его видимость, то он вроди во всех потоковых наследниках есть из коробки.
Сергей_ТВ public void run() {
flag = true;
while(!Thread.currentThread().isInterrupted() && flag){
prokladka();
}
}

private void prokladka(){
try {
Thread.sleep(10000);
potok ();

} catch (InterruptedException e) {
System.out.println("Поток прерван");
flag = false;

}
}
Поле, говорю, это не нужно и к тому же имеет дефект.


Да, флаг не к месту здесь. Он должен стоять за пределами run().
...
Понятно, что врядли кто стал проводить опыты по остановке длительной по времени выборки из MySQL. Поэтому напишу, что сделал.
В цикл чтения ResultSet добавил еще один флаг, а затем добавил условие для отмены стеймента

Код: java
1.
2.
3.
4.
5.
6.
7.
while (rs.next() && flagMySql ) {
      	                rs.getString(18);
               }
     
		if (!flagMySql) {
			stmt.cancel();
		}



Это стало работать. Причем после прерывания работы потока и остановки процесса выборки из MySQL, в консоле активность работы кода прекращалась. А после повторного вызова потока(с выборкой в том числе), выборка начиналась с начальных условий. Ошибок не наблюдал.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Поток не останавливается после того, как вызывает метод / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]