Java并发编程之FutureTask使用详解
一、FutureTask概念
FutureTask是一个实现了Future接口的类,它可以用来表示一个异步任务的结果。当异步任务完成时,FutureTask会通知等待的任务继续执行。FutureTask的主要作用是将任务的执行与返回值解耦,使得任务可以单独执行,而不需要等待返回值。
二、FutureTask使用场景
- 异步执行任务:当我们需要在多线程环境下执行一个任务,而不希望等待任务完成时,可以使用FutureTask。
- 提取异步任务返回值:当异步任务完成后,可以通过FutureTask获取任务的结果。
- 取消异步任务:FutureTask提供了取消异步任务的方法,当不需要执行某个异步任务时,可以使用此方法取消任务。
- 处理并行任务:当需要执行多个异步任务,并且这些任务之间相互独立时,可以使用FutureTask进行处理。
三、FutureTask代码示例
以下代码示例将展示如何使用FutureTask实现异步编程:
package service.study;
import com.alibaba.fastjson.JSONObject;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ConcurrentService {
public static void main(String[] args) throws Exception {
ConcurrentService service = new ConcurrentService();
service.futureTask();
}
public void futureTask() throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
Callable userCallable = new Callable() {
@Override
public JSONObject call() throws Exception {
return getUserInfo();
}
};
Callable bankCallable = new Callable() {
@Override
public JSONObject call() throws Exception {
return getBankInfo();
}
};
FutureTask<JSONObject> userInfoTask = new FutureTask<>(userCallable);
FutureTask<JSONObject> bankInfoTask = new FutureTask<>(bankCallable);
new Thread(userInfoTask).start();
new Thread(bankInfoTask).start();
JSONObject result = new JSONObject();
result.putAll(userInfoTask.get());
result.putAll(bankInfoTask.get());
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + " 总耗时:" + (end - start) + " ms");
}
private JSONObject getUserInfo() throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(3000L);
JSONObject json = new JSONObject();
json.put("name", "Lucy");
json.put("age", 18);
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + " getUserInfo 耗时:" + (end - start) + " ms");
return json;
}
private JSONObject getBankInfo() throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000L);
JSONObject json = new JSONObject();
json.put("no", "ICBC222200008888");
json.put("money", "200W");
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + " getBankInfo 耗时:" + (end - start) + " ms");
return json;
}
}
四、执行结果
总结
通过以上示例,我们可以看到FutureTask在异步编程中的应用。在实际项目中,可以根据需求使用FutureTask来提高代码的可读性和可维护性。