java多线程Future、FutureTask使用示例,返回异步的结果

来源:互联网 发布:常见网络诈骗手段有 编辑:程序博客网 时间:2024/05/18 14:14

1、Future、FutureTask介绍

Future是一个接口,该接口用来返回异步的结果。

FutureTask是一个类,是Future 的一个实现。

2、主要方法

future.get();或者future.get(10000, TimeUnit.MILLISECONDS);
  • 1
  • 2
  • 3

获取多线程异步执行结果,但get方法是一个同步方法,如果未拿到结果或者未超时,主线程则一直等待。

future.cancel(boolean flag)
  • 1

取消当前future任务。

future.isDone() 
  • 1

判断当前future是否已经获取到异步结果,或者说异步的多线程是否已经执行完成并返回结果。

future.isCancelled()
  • 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异步任务结果

 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




阅读全文
0 0