我正在编写一个小应用程序,现在我发现了一个问题。我需要调用一个(稍后可能是两个)方法(这个方法加载一些东西并返回结果),而不会滞后于应用程序的窗口。
我找到了像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块中放出来)。
在Java 8中,如果不需要参数,可以使用:
new Thread(MyClass::doWork).start();
或者在参数的情况下:
new Thread(() -> doWork(someParam))
首先,我建议查看Java线程文档。
使用线程,可以传入一个名为Runnable的接口类型。文档可在此处找到。runnable是具有run方法的对象。启动线程时,它将调用此可运行对象的run方法中的任何代码。例如:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Insert some method call here.
}
});
现在,这意味着当您调用t.start()时,它将运行您需要的任何代码,而不会滞后于主线程。这称为异步方法调用,这意味着它与您打开的任何其他线程(如主线程)并行运行
由于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的循环。 我
本文向大家介绍简单谈谈ThreadPoolExecutor线程池之submit方法,包括了简单谈谈ThreadPoolExecutor线程池之submit方法的使用技巧和注意事项,需要的朋友参考一下 jdk1.7.0_79 在上一篇《ThreadPoolExecutor线程池原理及其execute方法》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。本文解析Th
问题内容: 我是Java新手。有人可以帮我为什么不调用Run方法。提前致谢。 问题答案: 您需要将的实例传递给构造函数,以告诉新线程运行什么: (这是不幸的是,类已经以各种方式被设计得不好。这将是更有益的,如果它 不 具有方法本身,但 没有 强迫你传递到构造函数,然后你会发现在编译的问题-时间。)