Не удается завершить рабочий процесс, когда поток останавливается
Я просто не могу выяснить причину этой проблемы.
Проблема:
1) Я использую функцию Thread.Sleep, чтобы установить таймер для моего приложения.
2) Теперь, как только пользователь входит в веб-страницу, запускается таймер, если пользователь нажимает на любую ссылку, таймер (поток) останавливается, а затем запускается новый таймер.
3) Если они не активны, скажем, в течение 3 секунд, таймер заканчивается, и с этим также заканчивается рабочий процесс, связанный с веб-страницей.
Код:
DownloadSummariesPage.java
public DownloadSummariesPage(){
abc = new SimpleThread(this);
Link<Void> link = new Link<Void>("downloadSummaryLink") {
public void onClick() {
boolean threadStatus = abc.checkStatus();
if (threadStatus) {
abc.interrupt();
abc.stop();
abc = new SimpleThread(DownloadSummariesPage.this);
abc.start();
}
else
{
LOG.debug("thread is dead now");
endWorkflow();
LOG.debug("ending the workflow");
setResponsePage(MenuPage.class);
}
}
};
abc.start();
}
public void endWorkflow() {
abc.interrupt();
abc.stop();
boolean downloadReport = false;
LOG.debug("before action 201 inside endworkflow");
Map<String, Serializable> inputs = new HashMap<String, Serializable>();
inputs.put("downloadReport", downloadReport);
try {
wf.doAction(id, 201, inputs);//do not worry about this its for workflow
String empty = "";
populateDownloadReportDatabase(empty);
setResponsePage(MenuPage.class);
} catch (Exception e) {
LOG.debug("Exception while performing 201 workflow, getControlCancel "
+ e);
}
}
}
Мой следующий класс, который создает поток - SimpleThread.java
class SimpleThread extends Thread {
private static final Logger LOG = Logger.getLogger(SimpleThread.class);
boolean stillActive = true;
DownloadSummariesPage dsp;
SimpleThread(DownloadSummariesPage dp) {
this.dsp = dp;
}
public void run() {
// 5sec timer
LOG.debug("inside run method");
try {
Thread.sleep(3000);
stillActive = false;
} catch (InterruptedException e) {
LOG.debug("Exception in thread " + e);
e.printStackTrace();
}
LOG.debug("before endworkflow");
dsp.endWorkflow();//so this is what i actually want to do...
LOG.debug("at the end of simplethread");
}
public boolean checkStatus() {
return stillActive;
}
}
Случаи:
1) Что происходит: пользователь входит в спящий поток, пользователь щелкает по ссылке, поток останавливается и создает новый, если пользователь снова щелкает по нему снова, а теперь, если пользователь ничего не делает в течение 3 секунд, переменная stillAlive в классе SimpleThread имеет значение false и когда теперь пользователь нажимает на его конец, рабочий процесс отлично...
2) Что я хочу: если пользователь входит в поток запускается, и если пользователь не выполняет никаких действий, переменная stillAlive имеет значение false и dsp.endWorkflow();
Оператор теперь должен завершить рабочий процесс. право? но он просто останавливается после достижения внутри endWorkflow()
функционировать и не заканчивать рабочий процесс...
Надеюсь, вы понимаете это, я старался изо всех сил, чтобы это было понятно. Спасибо за ваше время..
Я ценю любую помощь..
1 ответ
Так что здесь есть несколько странных вещей.
сначала предположим, что поток спит без каких-либо прерываний в течение 3 секунд, поэтому он вызовет dsp.endWorkflow()
где вы называете это снова из onClick
метод.
второй stillAlive
флаг должен быть volatile
boolean volatile stillActive = true;
Возможная ошибка / ошибка возникнет в этом разделе.
if (threadStatus) {
abc.interrupt();
abc.stop();// you cannot get to this like just after interrupt, maybe thread abc goes first
abc = new SimpleThread(DownloadSummariesPage.this);
abc.start();
}
потому что предположим, что когда поток спит, вы прерываете его, затем останавливаете, но возможно, что поток завершает свою работу сразу после того, как вы прервете его (перед тем, как остановить его). так что лучше просто остановить это, или return
когда нить достигла улова.
try {
Thread.sleep(3000);
stillActive = false;
} catch (InterruptedException e) {
LOG.debug("Exception in thread " + e);
e.printStackTrace();
return;//////give up the rest work. so you don't need to call the stop too.
}
И здесь ошибка, предположим, что пользователь не нажимает кнопку отмены или новой загрузки, а поток просто завершает свой спящий режим и вызывает dsp.endWorkflow()
Так что же происходит с этим методом?
public void endWorkflow() {
abc.interrupt();
abc.stop();//error here!
boolean downloadReport = false;//this is unreachable
}
Просто посмотрите, вы вызываете этот метод abc
поток, и ошибка в том, что вы убиваете поток только внутри метода, прежде чем установить downloadReport
в false
, так что может быть так.
public void endWorkflow() {
boolean downloadReport = false;//this is unreachable
abc.interrupt();
abc.stop();//error here!
}
Я надеюсь, что мог бы помочь.