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())
,因为它没有输入参数。但是如果你需要一个在闭包之外的变量的输入,那么你可以用第二种方法。