1、Future、FutureTask介绍
Future是一个接口,该接口用来返回异步的结果。
FutureTask是一个类,是Future 的一个实现。
2、主要方法
- 1
- 2
- 3
获取多线程异步执行结果,但get方法是一个同步方法,如果未拿到结果或者未超时,主线程则一直等待。
- 1
取消当前future任务。
- 1
判断当前future是否已经获取到异步结果,或者说异步的多线程是否已经执行完成并返回结果。
- 1
判断当前future获取异步结果的任务是否被取消。
3、使用场景
从远程获取数据的计算结果,需要一定的时间,并且后面的代码与该数据暂时没有关系,直到最后才会使用该数据。
调用异步函数之后立马返回,主线程继续向下执行,等需要使用异步线程的数据的时候,再来调用获取或者等待获取该异步线程数据。
4、代码示例
ExecutorService threadPool = Executors.newCachedThreadPool();
ViseLog.e("提交异步任务");
Future<HashMap<String,String>> hashMapFuture= threadPool.submit(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取future异步任务结果");
return map;
}
});
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:39:33.694 MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:39:33.695 MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:39:33.699 MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:39:34.696 MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:39:34.700 MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:39:34.700 MainActivity.FromJava(MainActivity.java:212): ====异步任务返回的结果是:成功获取future异步任务结果
ViseLog.e("提交异步任务");
Future<HashMap<String,String>> hashMapFuture= threadPool.submit(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取future异步任务结果");
return map;
}
});
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:39:33.694 MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:39:33.695 MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:39:33.699 MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:39:34.696 MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:39:34.700 MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:39:34.700 MainActivity.FromJava(MainActivity.java:212): ====异步任务返回的结果是:成功获取future异步任务结果
ExecutorService threadPool = Executors.newCachedThreadPool();
ViseLog.e("提交异步任务");
FutureTask<HashMap<String,String>> hashMapFuture= new FutureTask(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取FutureTask异步任务结果");
return map;
}
});
threadPool.execute(hashMapFuture);
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====FutureTask异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:49:16.306 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:49:17.307 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:212): ====FutureTask异步任务返回的结果是:成功获取FutureTask异步任务结果
09-21 14:49:19.062 17832-18027/? E/WifiConfigManager: updateConfiguration freq=5805 BSSID=80:89:17:8d:e6:df RSSI=-61 "huoli-wh"WPA_PSK
ViseLog.e("提交异步任务");
FutureTask<HashMap<String,String>> hashMapFuture= new FutureTask(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取FutureTask异步任务结果");
return map;
}
});
threadPool.execute(hashMapFuture);
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====FutureTask异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:49:16.306 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:49:17.307 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:212): ====FutureTask异步任务返回的结果是:成功获取FutureTask异步任务结果
09-21 14:49:19.062 17832-18027/? E/WifiConfigManager: updateConfiguration freq=5805 BSSID=80:89:17:8d:e6:df RSSI=-61 "huoli-wh"WPA_PSK