Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как остановить Thread? / 20 сообщений из 20, страница 1 из 1
22.10.2015, 09:28
    #39083059
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
нашёл такой вопрос/ответ:
http://www.javacodegeeks.com/2014/11/multithreading-concurrency-interview-questions-answers.html How do we stop a thread in Java?
To stop a thread one can use a volatile reference pointing to the current thread that can be set to null by other threads to indicate the current thread should stop its execution:

и ответ:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
private static class MyStopThread extends Thread {
	private volatile Thread stopIndicator;

	public void start() {
		stopIndicator = new Thread(this);
		stopIndicator.start();
	}

	public void stopThread() {
		stopIndicator = null;
	}

	@Override
	public void run() {
		Thread thisThread = Thread.currentThread();
		while(thisThread == stopIndicator) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
}




Не понимаю как ссылка, установленная в null может остановить поток
...
Рейтинг: 0 / 0
22.10.2015, 09:43
    #39083077
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
questionerНе понимаю как ссылка, установленная в null может остановить поток
ссылка null/not null просто используется как флаг
...
Рейтинг: 0 / 0
22.10.2015, 10:15
    #39083108
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
questionerНе понимаю как ссылка, установленная в null может остановить поток
А мне не понятно, чем плох interrupt(), что аж пришлось городить неведомую фигню?
...
Рейтинг: 0 / 0
22.10.2015, 10:20
    #39083114
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
wadmanА мне не понятно, чем плох interrupt(), что аж пришлось городить неведомую фигню?
Ну, например, тем что он работает только на заблокированных потоках.
...
Рейтинг: 0 / 0
22.10.2015, 10:23
    #39083120
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
questionerНе понимаю как ссылка, установленная в null может остановить поток
Никак. Дебильное описание. Обычный volatile флаг, и не важно ссылка ли там на поток или что ещё.
Останавливать поток не безопасно, поэтому соответствующие методы depreacted.
Безопасно - попросить поток остановиться и тогда поток остановится когда ему это будет удобно безопасно высвобождая все ресурсы.
...
Рейтинг: 0 / 0
22.10.2015, 10:23
    #39083122
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
BlazkowiczwadmanА мне не понятно, чем плох interrupt(), что аж пришлось городить неведомую фигню?
Ну, например, тем что он работает только на заблокированных потоках.
Наверное, для меня стоит развернуть эту мысль. А то применяю везде (в т.ч. и на андроиде) и проблем не испытывал.
...
Рейтинг: 0 / 0
22.10.2015, 10:31
    #39083132
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
wadmanНаверное, для меня стоит развернуть эту мысль. А то применяю везде (в т.ч. и на андроиде) и проблем не испытывал. Если нет проверять isInterrupted либо других флагов, если нет IO и блокировок синхронизации, то выкидывать InterruptedException некому. Поток может колбасить задачу до умопомрачения.

Возможно имелось ввиду использование isInterrupted() вместо дополнительного флага и я не так понял?
...
Рейтинг: 0 / 0
22.10.2015, 10:37
    #39083139
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
BlazkowiczЕсли нет проверять isInterrupted
Дак это само собой. :) У ТС по сути создан дубликат стандартных методов. Не понятной, на кой.
...
Рейтинг: 0 / 0
22.10.2015, 12:01
    #39083283
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
wadmanBlazkowiczЕсли нет проверять isInterrupted
Дак это само собой. :) У ТС по сути создан дубликат стандартных методов. Не понятной, на кой.

Есть такие изобретатели. Главное, чтобы их код не пролез в продакшн. А статейки пусть пишут :D
...
Рейтинг: 0 / 0
22.10.2015, 14:47
    #39083661
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
А напишите пожалуйста, развернуто, как надо останавливать поток с примером кода, чтобы не было недопониманий у меня и всех остальных читающих топик.
...
Рейтинг: 0 / 0
22.10.2015, 15:25
    #39083768
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
ИзопропилquestionerНе понимаю как ссылка, установленная в null может остановить поток
ссылка null/not null просто используется как флаг

какой толк слипать тред если ссылка null ?
...
Рейтинг: 0 / 0
22.10.2015, 15:34
    #39083793
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
questionerкакой толк слипать тред если ссылка null ?
Видишь, код ещё и запутанным вышел. sleep() это просто имитация полезной деятельности. Никакой смысла он в этом примере не несет.
Приведенный код вообще изобилует тупаком. Так, например, у нас оказывается 2 экземпляра Thread, когда по-факту нужен только один. Второй тупо используется как Runnable. То есть у нас где-то есть ссылка на MyStopThread, которая обладает всеми методами Thread, но, их использовать нет смысла, так как этот поток не запущен. Вместо него запущен другой (OMFG!). Да, это будет покруче #define true false;
...
Рейтинг: 0 / 0
22.10.2015, 15:38
    #39083805
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
questionerА напишите пожалуйста, развернуто, как надо останавливать поток с примером кода, чтобы не было недопониманий у меня и всех остальных читающих топик.

А чего тут развернуто? Тупо выкидываем всё лишнее:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class MyStopThread extends Thread {
	@Override
	public void run() {
		while(!isInterrupted()) {
                        doNextPortionOfWork();
		}
	}
}



Имеем код, который проще, и ничем не уступает приведенному. Стоит так же учесть что использовать класс Thread подобным образом раньше просто не рекомендовали, а с появлением j.u.c. так и вообще смысла нет.
...
Рейтинг: 0 / 0
22.10.2015, 15:40
    #39083808
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
Blazkowiczquestionerкакой толк слипать тред если ссылка null ?
Видишь, код ещё и запутанным вышел. sleep() это просто имитация полезной деятельности. Никакой смысла он в этом примере не несет.
Приведенный код вообще изобилует тупаком. Так, например, у нас оказывается 2 экземпляра Thread, когда по-факту нужен только один. Второй тупо используется как Runnable. То есть у нас где-то есть ссылка на MyStopThread, которая обладает всеми методами Thread, но, их использовать нет смысла, так как этот поток не запущен. Вместо него запущен другой (OMFG!). Да, это будет покруче #define true false;

Что код говно я понял.
Как надо не понял)
...
Рейтинг: 0 / 0
22.10.2015, 17:30
    #39083964
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
BlazkowiczquestionerА напишите пожалуйста, развернуто, как надо останавливать поток с примером кода, чтобы не было недопониманий у меня и всех остальных читающих топик.

А чего тут развернуто? Тупо выкидываем всё лишнее:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class MyStopThread extends Thread {
	@Override
	public void run() {
		while(!isInterrupted()) {
                        doNextPortionOfWork();
		}
	}
}



Имеем код, который проще, и ничем не уступает приведенному. Стоит так же учесть что использовать класс Thread подобным образом раньше просто не рекомендовали, а с появлением j.u.c. так и вообще смысла нет.

Это код внутри потока.

Если хотим закончить исполнение потока, то просто пишем
Код: java
1.
threadReference.interrupt()

?
...
Рейтинг: 0 / 0
22.10.2015, 17:35
    #39083970
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
Наверное вопрос звучал - как остановить thread если разраб изначально никаких флажков туда не заложил.
...
Рейтинг: 0 / 0
22.10.2015, 17:45
    #39083980
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
Всего три варианта:
1. Вытрясти (новый код из разработчика);
2. Переписать (самому);
3. Выбросить (с орг.выводами).
...
Рейтинг: 0 / 0
22.10.2015, 18:09
    #39083999
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
Blazkowicz,

Я ведь правильно понимаю, что если я вызову thread.interrupt(), а поток в данный момент sleep или wait, то вылетит InterruptedException?
...
Рейтинг: 0 / 0
22.10.2015, 20:45
    #39084111
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
questioner Blazkowicz,

Я ведь правильно понимаю, что если я вызову thread.interrupt(), а поток в данный момент sleep или wait, то вылетит InterruptedException?
Да, и на многих IO блокировках тоже, если я ничего не путаю.
http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html
...
Рейтинг: 0 / 0
22.10.2015, 22:38
    #39084174
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить Thread?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  @Override
  public void run() {
    while (!Thread.interrupted()) {
      //if(cancel) Thread.currentThread().interrupt();
      try {
        doTask();
        Thread.sleep(sleep);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
    }
  }


если поток Future можно future.cancel(true);
или жестко Thread.currentThread().interrupt();
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как остановить Thread? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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