Я работаю над веб-приложением, которое должно выполнять некоторые длительные задачи (задачи, которые занимают около 20 минут).MultiThreading Java - приостановка длительных задач из веб-приложения
Я хочу, чтобы они работали на параллельном потоке, чтобы пользователь мог продолжать работать над чем-то еще в веб-приложении во время выполнения задачи.
Предположим, что это класс, который выполняет задачу
public class TaskPerformer {
public void performTask(String[] taskParameters){
// Long running task
}
}
Я создал класс резьбы, как этот
public class TaskThread extends Thread {
private TaskPerformer performer = new TaskPerformer();
private String threadName;
public TaskThread(String name){
this.threadName = name;
}
public void run(){
String[] params = {"Param1","Param2","Param3"};
this.performer.performTask(params); // This might take 15-20 mins to complete
System.out.println("Task completed successfully");
}
}
Теперь в моем веб-приложение, я создаю новый поток, основанный на этом один, и запустите его, чтобы задача выполнялась в отдельном потоке. Это позволяет моему пользователю продолжить некоторые другие работы на моем веб-сервере.
Теперь, я хотел бы добавить кнопку на моем графическом интерфейсе, чтобы приостановить и остановить эту задачу.
Будучи новым для многопоточности, я прочитал и понял, что не могу использовать suspend() или resume(), поскольку они обесцениваются. Так что в моих сеансов методом проб и ошибок, я пытался реализовать простую pauseable нить, как показано ниже:
public void run(){
for(int i=10;i>0;i--){
checkForPaused();
System.out.println(this.threadName + " -- Counter -- " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
я реализовал метод checkForPaused() для проверки булевой флаг, чтобы проверить, если мне нужно приостановить поток и сделать wait() для статической переменной до тех пор, пока логическое значение не будет изменено.
(Я получил эту идею с этого поста How to Pause and Resume a Thread in Java from another Thread)
Но, в западню в растворе, является то, что я должен назвать checkForPaused() в каждой итерации моего цикла. Это означает, что я не могу приостановить длинную задачу, которую я собираюсь начать, потому что я делаю это только один раз в потоке.
Может кто-нибудь предложить идею, как я могу это реализовать?
Вы ча n запустите фоновый процесс, который вы можете убить в любое время. –
Поместите публичный volatile boolean в поток, называемый паузой. В своей задаче неоднократно проверяйте приостановленное логическое и сон, если он приостановлен. – bhspencer
@PeterLawrey Спасибо, но не могли бы вы объяснить, как я могу это сделать? любая начальная точка ссылки? – sriramsridharan