У меня есть поток Java
с методом run, который вычисляет много вещей. Вы можете думать об этом как о серии математических утверждений следующим образом. Обратите внимание, что в каждом вычислении могут использоваться другие методы, которые, в свою очередь, могут иметь дополнительные циклы и т. Д.Java - завершение метода в потоке
public void run() {
[computation 1 goes here here that takes a few seconds]
[computation 2 goes here that takes a few seconds]
....
[computation 30 goes here that takes a few seconds]
}
Существует GUI
, который печатает вывод этих заявлений, поскольку они производят свои результаты, и я хотел бы, чтобы пользователь мог сказать «Стоп», когда они хотят. Вот два метода я думал о
Метод 1: Многие Boolean Проверяет [Смотрит СТРАШНО]
private boolean stop;
public void run() {
if(!stop)
[computation 1 goes here here that takes a few seconds]
if(!stop)
[computation 2 goes here that takes a few seconds]
....
if(!stop)
[computation 30 goes here that takes a few seconds]
}
В этом методе, когда флаг остановки был установлен верно, вычисления будут конец. Обратите внимание, как это выглядит глупо, имея 30 if
заявлений. Важно отметить, что критический вопрос заключается в том, как часто устанавливать эти условия. Обратите внимание, что вычисления на каждой строке не обязательно являются одной строкой. Взято до крайности, делает КАЖДУЮ строку в методе run()
заслуживает того, чтобы позвонить над ним над номером if(!stop)
? Это не похоже на хороший дизайн.
Способ 2: Обобщая вычисление [НЕ МОЖЕТ СДЕЛАТЬ ЭТО]
pirivate boolean stop;
public void run() {
for(int i = 0; i < computationsN && !stop; i++) {
computuations.get(i).compute();
}
Я полагаю, что этот метод будет предложен, поэтому я хотел бы просто сказать, что это невозможно в моем случае, учитывая явные вариации в строках, которые я называю «вычислениями» для простоты. Обычно я делал это для потоков, которые являются базовыми циклами while
, и он отлично подходит для таких целей. Но не в этом случае, когда метод run()
является просто огромным методом переменного кода.
Какие-либо другие решения там? Похоже, это должна быть универсальная проблема. Заранее спасибо!
Catch InterruptedException, бросить прерывание в потоке ...? – keshlam
Бросить прерывание на поток? что вы имеете в виду? – CodeGuy
Поначалу кажется, что (по крайней мере), метод 1 может быть преувеличен, помещая вычисления в общий класс и набивая их в массив. Перейдите через массив и проверьте флаг остановки после каждого вычисления. Редактировать: nevermind! Я просто понял, что это ваш метод 2. Сожалею! :) Но это выглядит актуальным: http://stackoverflow.com/questions/5915156/how-can-i-kill-a-thread-without-using-stop – Nathan