当前位置: 首页 > 知识库问答 >
问题:

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

潘志国
2023-03-14

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

我找到了像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块中放出来)。

共有3个答案

宋伯寅
2023-03-14

在Java 8中,如果不需要参数,可以使用:

new Thread(MyClass::doWork).start();

或者在参数的情况下:

new Thread(() -> doWork(someParam))
阎咏思
2023-03-14

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

使用线程,可以传入一个名为Runnable的接口类型。文档可在此处找到。runnable是具有run方法的对象。启动线程时,它将调用此可运行对象的run方法中的任何代码。例如:

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

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

邵昆琦
2023-03-14

由于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
    }

}

当您的参数列表与必需的@功能接口中的参数列表相同时,您可以使用它,例如Runnable或Callable。

更新2:我强烈建议使用java。util。同时发生的执行器#newSingleThreadExecutor(),用于执行激发和遗忘任务。

例子:

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

请参阅更多:<代码>平台。在JavaFX中,runLater和任务,方法引用。

 类似资料:
  • 问题内容: 我在PyQt中有一个带有功能的GUI 。容易想象,当新图像应添加到QListWidget中时被调用。为了检测文件夹中的新图像,我使用了with来检测文件夹中的文件更改,然后该线程直接调用。 出于线程安全的原因,这会产生不应在gui线程之外调用的警告。 使此线程安全的最佳和最简单的方法是什么?QThread?信号/插槽?QMetaObject.invokeMethod?我只需要从线程传递

  • 我需要在Springboot中实现多线程,同时使用POST方法调用API。我根据一个SELECT查询从oracle数据库中提取记录,然后使用行映射器逐个遍历每个记录。在下一步中,我只调用一个方法将这些记录发送到API,以postmapping的形式发送这些记录并取回记录。 因为select查询一次可以返回10、20或100条记录。逐个调用每条记录并不理想。我在想我是否可以一次发送多个记录。我不知道

  • 我是Java初学者。我想在运行的Java线程对象中调用一个方法。它总是引发以下异常: 线程“AWT-EventQueue-0”java中出现异常。lang.NullPointerException:无法调用“Graphic\u handler.next()”,因为“this.this$0.grap”为null (代码已简化) 下面是我调用该方法的代码部分: 我试图在这里调用方法Next()和las

  • 我有以下ThreadPoolTaskExecator2配置 在我的公共类AdminService中,我有两个方法。 void triggerJob() 布尔执行sql(字符串sql) 如何将ThreadPoolTaskExecutor插入triggerJob方法,以便在第一个方法中调用executeSql时创建新线程。 在triggerjob中,我有一个基于条件调用executeSql的循环。 我

  • 问题内容: 我是Java新手。有人可以帮我为什么不调用Run方法。提前致谢。 问题答案: 您需要将的实例传递给构造函数,以告诉新线程运行什么: (这是不幸的是,类已经以各种方式被设计得不好。这将是更有益的,如果它 不 具有方法本身,但 没有 强迫你传递到构造函数,然后你会发现在编译的问题-时间。)

  • 我有一个简单的类在Java: 在C中,我执行以下JNI调用: 如果一个程序调用静态方法c_call_function(),则可以。 但是如果一个多线程程序调用c_call_function(),当传递env行时,它会给我以下消息- 访问违规在0x0000006FC77154读取到0x0000000000000000 如果程序是多线程的,则使用相同的JNIEnv变量。但我也尝试通过AttachCur