在Java中,若需执行运算任务并获取线程结果,可通过使用java.util.concurrent包中的Callable和Future接口简化实现。Callable接口类似于Runnable接口,允许在call()方法中定义线程执行操作,且call()方法具备泛型返回值。与Runnable实例不同,Callable实例不可直接作为Thread类构造方法参数。Future接口支持保存异步运算...
java面试:什么是callable和future?
在Java中,若需执行运算任务并获取线程结果,可通过使用java.util.concurrent包中的Callable和Future接口简化实现。Callable接口类似于Runnable接口,允许在call()方法中定义线程执行操作,且call()方法具备泛型返回值。与Runnable实例不同,Callable实例不可直接作为Thread类构造方法参数。
Future接口支持保存异步运算结果,具备get()方法用于获取结果,如结果未准备好则线程阻塞直至结果可用。get(long timeout, TimeUnit unit)方法类似,但设有限定时间,超时后抛出TimeoutException。cancel(boolean mayInterrupt)方法允许取消运算,根据参数决定是否立即取消或继续执行。isCancelled()和isDone()方法分别检查运算是否被取消或已完成。
FutureTask类作为适配器,同时实现Runnable和Future接口,关联Callable实例,将Callable转换为Runnable,适合用于Thread类构造方法参数。例如,创建Callable实例、FutureTask实例和Thread实例,启动线程执行Callable实例中的call()方法,运算结果保存在FutureTask实例中。
通过Machine类示例(Machine.java),演示了两个线程间进行异步运算的过程。Machine类实现了Callable接口,threadMachine线程执行call()方法计算从1加到100的和并返回结果。主线程调用task.get()方法获取运算结果,线程阻塞直至结果可用,退出get()方法。
综上所述,Callable和Future接口提供了一种简洁且高效的方式来实现异步运算,简化了共享变量操作,降低了同步复杂性,并通过Future接口提供了获取运算结果的灵活性和控制能力。2024-11-12