您的位置:首页 > 编程语言 > Java开发

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

2017-09-21 14:44 826 查看


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐