Java无阻塞地等待未来的结果

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.

我有一个应用程序,用户通过单击按钮(该数字已定义)创建任务(可调用),并进行一些计算。我希望在任务完成时能够做出反应。使用Future.get()会阻止应用程序。当可调用函数返回结果时,有什么方法可以做出反应吗

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未来方法的参数