【发布时间】:2015-08-21 12:23:50
【问题描述】:
我正在开发一个需要执行一些长时间运行的任务(大约需要 20 分钟才能完成的任务)的 Web 应用程序。
我希望它们在并行线程上运行,以便用户可以在任务运行时继续处理 Web 应用程序中的其他内容。
假设这是执行任务的类
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");
}
}
现在,在我的网络应用程序中,我基于这个创建一个新线程并启动它,以便任务在单独的线程上发生。这允许我的用户在我的 web 应用上继续他的一些其他工作。
现在,我想在我的 GUI 上添加一个按钮来暂停和停止此任务。
作为多线程的新手,我做了一些阅读,发现我不能使用suspend() 或resume(),因为它们已被贬值。因此,在我的其他试错会话中,我尝试实现一个简单的可暂停线程,如下所示:
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()。这意味着,我无法暂停即将开始的长任务,因为我在一个线程中只执行一次。
任何人都可以建议我如何实现这一点吗?
【问题讨论】:
-
您可以启动一个可以随时终止的后台进程。
-
在名为 pause 的线程上放置一个公共 volatile 布尔值。在您的任务中反复检查暂停的布尔值,如果暂停则休眠。
-
@PeterLawrey 谢谢,但你能解释一下我该怎么做吗?有什么参考起点吗?
-
@bhspencer 谢谢,但这正是我的问题。我不想定期检查标志,因为我必须跨包和类进行检查。还有其他选择吗?
标签: java multithreading