Future异步计算

本文通过一个具体的Java示例介绍了如何使用Callable线程实现异步计算。Callable线程可以独立于调用线程执行任务,并允许主线程在等待结果的同时继续执行其他操作。这种机制适用于需要长时间运行的任务,同时保持程序的响应性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人认为,此处的异步计算指的是调用函数在持续监测Callable线程运算结果的同时可以处理其他事情,当Callable线程的运算结果满足条件了,调用函数再去处理与Callable线程相关的事情。就相当于触发机制,调用函数被Callable线程的运算结果触发。

摘抄自《编写高质量代码》的一个例子:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test {
	public static void main(String[] args) throws InterruptedException, ExecutionException{
		ExecutorService es=Executors.newSingleThreadExecutor();
		Tax t=new Tax(10000);
		Future<Integer> future=es.submit(t);
		while(future.isDone()==false){
			System.out.print("#");
			Thread.sleep(1000);
		}
		es.shutdown();
		System.out.println("\n结果:"+future.get());
	}
}
class Tax implements Callable<Integer>{
	private int money;
	public Tax(int money){
		this.money=money;
	}
	public Integer call() throws InterruptedException{
		Thread.sleep(10000);
		return money/34;
	}
}

这个在让main函数等待自定义线程上也很好用。

### Java 中 Future 对象从异步到同步的转换 在 Java 编程环境中,`Future` 接口用于表示异步计算的结果。为了将 `Future` 的异步特性转变为同步执行,通常会使用其提供的 `get()` 方法来获取结果,在此过程中当前线程会被阻塞直到任务完成。 #### 使用 `Future.get()` 最简单的方法就是直接调用 `future.get()` 来等待并获得返回值: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { TimeUnit.SECONDS.sleep(2); return 123; }; Future<Integer> future = executor.submit(task); try { Integer result = future.get(); // 阻塞直至得到结果 System.out.println(result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } executor.shutdown(); ``` 这种方法能够有效地把异步的任务变为同步处理[^1]。 #### 结合超时机制防止无限期挂起 为了避免可能发生的长时间无响应情况,可以在调用 `get(long timeout, TimeUnit unit)` 版本的时候设置最大等待时间: ```java Integer result = future.get(5, TimeUnit.SECONDS); // 设置最长等待时间为五秒 ``` 当超过指定的时间范围而未能取得结果,则抛出 `TimeoutException` 异常。 #### 处理异常状况下的同步化 考虑到并发编程中可能出现的各种意外情形,建议总是捕获并妥善处理由 `get()` 抛出来的各种潜在异常,比如 `ExecutionException`, 它封装了由于任务失败所引发的实际原因;以及 `CancellationException` 和 `InterruptedException` 等其他可能性。 #### 利用 CountDownLatch 实现更复杂的场景 对于某些特定需求而言,除了基本的 `Future.get()` 方式外还可以考虑引入额外工具类如 `CountDownLatch` 或者 `CyclicBarrier` 达成更加灵活的效果。不过这已经超出了一般意义上的“异步转同步”,而是属于更高层次的设计模式范畴[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值