Java无阻塞地等待未来的结果
我有一个应用程序,用户通过单击按钮(该数字已定义)创建任务(可调用),并进行一些计算。我希望在任务完成时能够做出反应。使用Future.get()会阻止应用程序。当可调用函数返回结果时,有什么方法可以做出反应吗Java无阻塞地等待未来的结果,java,java.util.concurrent,Java,Java.util.concurrent,我有一个应用程序,用户通过单击按钮(该数字已定义)创建任务(可调用),并进行一些计算。我希望在任务完成时能够做出反应。使用Future.get()会阻止应用程序。当可调用函数返回结果时,有什么方法可以做出反应吗 private static void startTask(int i){ try{ Future<Integer> future = executor.submit(callables.get(i-1)); ongoingTasks.
private static void startTask(int i){
try{
Future<Integer> future = executor.submit(callables.get(i-1));
ongoingTasks.put(i, future);
awaitResult(future, i);
}
catch(Exception e){
e.printStackTrace();
}
}
private static void awaitResult(Future<?> future, int taskNo) throws InterruptedException, ExecutionException{
System.out.println("result : " + future.get());
JButton b = buttons.get(taskNo);
b.setEnabled(false);
}
私有静态无效起始任务(int i){
试一试{
Future-Future=executor.submit(callables.get(i-1));
把(我,未来);
等待结果(未来,i);
}
捕获(例外e){
e、 printStackTrace();
}
}
private static void waitresult(Future Future,int taskNo)抛出InterruptedException、ExecutionException{
System.out.println(“结果:+future.get());
JButton b=buttons.get(taskNo);
b、 setEnabled(假);
}
听起来你想要一份工作。您有一个函数,它是提供值的“供应商”。这就是实际工作的函数
然后,您就有了一个函数,该函数在执行worker时接受该值
这都是异步的,所以不管结果如何,其他一切都会继续进行
class Main
{
private static Integer work() {
System.out.println("work");
return 3;
}
private static void done(Integer i) {
System.out.println("done " + i);
}
public static void main (String... args)
{
CompletableFuture.supplyAsync(Main::work)
.thenAccept(Main::done);
System.out.println("end of main");
}
}
样本输出:
end of main
work
done 3
可能的重复计算应该在第二个线程上完成,这样主线程(或gui线程)就可以永远不要冻结。您可以创建某种回调,将您的逻辑放在不同的线程中运行,这样它就不会被阻塞。您还可以探索RxJava,它为基于事件的反应式编程提供了一些很酷的东西。@Obenland您能详细说明一下吗?很遗憾,我必须使用ExecutorService@CAMPy你可以通过这项服务作为提供同步和其他CMPLETABLE未来方法的参数