在新线程中调用方法的简单方法

2022-09-03 03:12:03

我正在编写小应用程序,现在我发现了一个问题。我需要调用一个(后来可能是两个)方法(此方法加载一些东西并返回结果),而不会在应用程序窗口中滞后。

我发现类像 或 ,但我不明白如何使用这些类。ExecutorCallable

你能发布任何解决方案,这对我有帮助吗?

感谢您的所有建议。

编辑:该方法必须返回结果。此结果取决于参数。像这样:

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


答案 1

从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相同时,例如RunnableCallable,则可以使用它。

更新 2:我强烈建议使用来执行“即发即弃”的任务。java.util.concurrent.Executors#newSingleThreadExecutor()

例:

Executors
    .newSingleThreadExecutor()
    .submit(Example::someMethod);

查看更多:Platform.runLaterTask in JavaFX方法参考


答案 2

首先,我建议查看 Java 线程文档

使用 Thread,可以传入名为 .可在此处找到文档。可运行对象是具有方法的对象。当您启动线程时,它将调用此可运行对象的方法中的任何代码。例如:Runnablerunrun

Thread t = new Thread(new Runnable() {
         @Override
         public void run() {
              // Insert some method call here.
         }
});

现在,这意味着当你调用时,它将运行你需要的任何代码,而不会滞后于主线程。这称为方法调用,这意味着它与已打开的任何其他线程(如线程)并行运行。:)t.start()Asynchronousmain


推荐