[英]Java Callable thread swing gui
我错过了一些东西,我创建了一个基于callable的calss,并在我的gui中创建了一个实例,并在执行操作时调用它。 唯一的问题是GUI没有响应,因为进程正在同一线程上运行,因此必须等待它完成才能访问GUI。 以下是一些代码:
public class MYProject {
public static class CreateProject implements Callable<Boolean>{
private String m_url;
private String m_project;
private String m_options;
public CreateProject(String url, String project, String options){
m_url = url;
m_project = project;
m_options = options;
}
public Boolean call(){
Boolean result = true;
try {
if (os.toLowerCase().contains("windows")){
command = windowsCMD + command;
}
String line;
Process p = Runtime.getRuntime().exec(command);
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader bri = new BufferedReader(isr);
try {
while ((line = bri.readLine()) != null) {
if(line.startsWith("ERROR")){
System.out.println(line);
result = false;
break;
}
}
p.waitFor();
}
finally {
bri.close();
}
}
catch (Exception err) {
System.err.println("Unable to create project: " + err.getMessage()
+ "\n");
result = false;
}
return result;
}
}
}
并在GUI中:
private void jButtonRefreshActionPerformed(java.awt.event.ActionEvent evt) {
jTextAreaConsole.append("Creating project.\n");
MYProject.CreateProject blah = new MYProject.CreateProject("url", "project", "options");
String result = blah.call();
jTextAreaConsole.append("Project creation successful: " + result);
}
结果是进程p仍在与gui相同的线程上运行,并且无法单击任何内容,并且jTextAreaConsole直到进程完成后才更新。 谁能提供一些有关我应如何实施的建议?
为长时间运行的任务实现一个SwingWorker
。 有关更多详细信息,请参见Swing中的并发 。
结果是进程p仍在与gui相同的线程上运行,并且无法单击任何内容,并且jTextAreaConsole
是的,它确实在做什么p.waitFor(); 在你的代码中
waitFor()
如有必要,使当前线程等待,直到此Process对象表示的进程终止。
从
您可能想要使用@Andrew Thompson发布的SwingWorker,或者可以实现Runnable的run方法并在新线程中启动它,甚至可以使用Executor类,例如@hoaz发布
为了使Callable在单独的线程中运行,您需要使用Executors
您应该使用Executor
在单独的Thread
运行Callable
实例。
Executor executor = Executors.newSingleThreadExecutor();
executor.submit(blah);
...
executor.shutdown(); // free resources
请注意,您应该创建一次执行程序,并在程序退出时销毁它。 否则,您可能会泄漏资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.