Java 在新线程中调用方法的简单方法
我正在编写一个小应用程序,现在我发现了一个问题。 我需要调用一个(以后可能是两个)方法(这个方法加载一些东西并返回结果),而不会滞后于应用程序的窗口 我发现像Java 在新线程中调用方法的简单方法,java,multithreading,javafx,ui-thread,Java,Multithreading,Javafx,Ui Thread,我正在编写一个小应用程序,现在我发现了一个问题。 我需要调用一个(以后可能是两个)方法(这个方法加载一些东西并返回结果),而不会滞后于应用程序的窗口 我发现像Executor或Callable这样的类,但我不知道如何使用这些类 你能帮我发布一些解决方案吗 谢谢你的建议 编辑:方法必须返回结果。此结果取决于参数。 大概是这样的: public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, Ma
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;
}
}
使用此代码,我再次出现错误(即使我将
returnnull
从catch块中取出) 首先,我建议看一下
使用线程,可以传入名为Runnable
的接口类型。可以找到文档。可运行对象是具有run
方法的对象。启动线程时,它将调用此可运行对象的run
方法中的任何代码。例如:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Insert some method call here.
}
});
现在,这意味着当您调用
t.start()
时,它将运行您需要的任何代码,而不会滞后于主线程。这称为Asynchronous
方法调用,这意味着它与您打开的任何其他线程(如main
线程)并行运行 由于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
}
}
当您的参数列表与required中的相同时,您可以使用它,例如,或
更新2:
我强烈建议使用java.util.concurrent.Executors#newSingleThreadExecutor()
来执行fire和forget任务
例如:
Executors
.newSingleThreadExecutor()
.submit(Example::someMethod);
请参阅更多信息:,.在Java 8中,如果不需要参数,您可以使用:
new Thread(MyClass::doWork).start();
或在参数的情况下:
new Thread(() -> doWork(someParam))
在javadoc中有一些例子。以及官方教程中的并发线程。这就是我的出发点。如果你不了解这些材料中的某些特定内容,或者你一直在使用其中的信息,那么你应该问一个新问题。我看到了这些示例,但是我无法实现我想要的。我认为你在寻找一个
可调用的
,所以请关注这些和相关类/方法的文档submit()
应返回一个Future
,当结果可用时,它将允许您执行某些操作(如更新UI)。我将对此进行查看,谢谢。我尝试了类似的操作,但不起作用(下一个答案中的详细信息)如何将参数传递给相对的调用方法。参数只是隐藏的,它取决于接口的输入参数。当您编写新线程(MyClass::doWork).start()时代码>您还可以为Runabble编写新线程(()->doWork())
,因为它没有输入参数。但是如果你需要一个在闭包之外的变量的输入,那么你可以用第二种方法。