我正在编写小应用程序,现在我发现了一个问题。 我需要调用一个(后来可能是两个)方法(这个方法加载一些东西并返回结果)而不会滞后于app的窗口。
我找到了Executor
或Callable
等类,但我不明白如何使用这些类。
请你发布任何解决方案,这对我有帮助吗?
感谢所有建议。
编辑方法必须返回结果。此结果取决于参数。 像这样:
public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
return webClient.getPage(page);
}
此方法大约需要8-10秒。执行此方法后,可以停止线程。但我需要每2分钟调用一次方法。
修改:我用以下代码编辑了代码:
public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
Thread thread = new Thread() {
public void run() {
try {
loadedPage = webClient.getPage(page);
} catch (FailingHttpStatusCodeException | IOException e) {
e.printStackTrace();
}
}
};
thread.start();
try {
return loadedPage;
} catch (Exception e) {
return null;
}
}
使用此代码,我再次收到错误(即使我将return null
放在 catch 块之外。
答案 0 :(得分:30)
从Java 8开始,您可以使用更短的形式:
new Thread(() -> {
// Insert some method call here.
}).start();
<强>更新强> 此外,您可以使用方法参考:
class Example {
public static void main(String[] args){
new Thread(Example::someMethod).start();
}
public static void someMethod(){
// Insert some code here
}
}
当您的参数列表与所需的@FunctionalInterface相同时,您可以使用它,例如Runnable或Callable。
更新2:
我强烈建议使用java.util.concurrent.Executors#newSingleThreadExecutor()
来执行即发即弃任务。
示例:
Executors
.newSingleThreadExecutor()
.submit(Example::someMethod);
查看更多:Platform.runLater
and Task
in JavaFX,Method References。
答案 1 :(得分:25)
首先,我建议您查看Java Thread Documentation。
使用Thread,您可以传入名为Runnable
的接口类型。可以找到文档here。 runnable是具有run
方法的对象。当您启动一个线程时,它将调用此runnable对象的run
方法中的任何代码。例如:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Insert some method call here.
}
});
现在,这意味着当你调用t.start()
时,它将运行你需要的任何代码而不会滞后主线程。这称为Asynchronous
方法调用,这意味着它与您打开的任何其他线程并行运行,如main
线程。 :)
答案 2 :(得分:6)
在Java 8中,如果不需要参数,您可以使用:
new Thread(MyClass::doWork).start();
或者参数:
new Thread(() -> doWork(someParam))