• FutureTask 概念及其相关使用



    多线程任务,一般用于数据量较大的场景,比如开启多个异步方法先分别去执行,最终返回数据。

    例子:
    (1)老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水,
    水买回来了放桌上,我需要的时候再去get。
    (2)4个同学,A算1+20,B算21+30,C算31*到40,D算41+50,是不是C的计算量有点大啊,
    FutureTask单起个线程给C计算,我先汇总ABD,最后等C计算完了再汇总C,拿到最终结果
    (3)高考:会做的先做,不会的放在后面做


    原理:

    在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,
    当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。

    一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

    仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,
    就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,
    然后会返回结果或者抛出异常。

    只计算一次
    get方法放到最后


    编码:

    MyTask.java类

    public class MyTask  implements Callable<Object>{    
        private String args1;
        private String args2;
        //构造函数,用来向task中传递任务的参数
        public  MyTask(String args1,String args2) {
            this.args1=args1;
            this.args2=args2;
        }
        //任务执行的动作
        @Override
        public Object call() throws Exception {
            
            for(int i=0;i<100;i++){
                System.out.println(args1+args2+i);
            }
            return true;
        }
    }

     FutureTask使用方法

    public static void main(String[] args) {
            MyTask myTask = new MyTask("11", "22");//实例化任务,传递参数
            FutureTask<Object> futureTask = new FutureTask<>(myTask);//将任务放进FutureTask里
            //采用thread来开启多线程,futuretask继承了Runnable,可以放在线程池中来启动执行
            Thread thread = new Thread(futureTask);
            thread.start();
            
            try {
                //get():获取任务执行结果,如果任务还没完成则会阻塞等待直到任务执行完成。如果任务被取消则会抛出CancellationException异常,
                //如果任务执行过程发生异常则会抛出ExecutionException异常,如果阻塞等待过程中被中断则会抛出InterruptedException异常。
                boolean result = (boolean) futureTask.get();
                System.out.println(result);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
  • 相关阅读:
    [moka同学笔记]八、Yii2.0课程笔记(魏曦老师教程)[授权]
    [moka同学转载]Yii2 中国省市区三级联动
    [moka同学笔记]四、Yii2.0课程笔记(魏曦老师教程)[匿名函数的使用操作]
    [moka同学笔记]Linux命令基本格式及目录处理命令
    [moka同学笔记]使用composer 安装yii2以及遇到的问题
    [moka同学笔记]MySql语句整理
    [moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)关联字段增加搜索
    Android笔记:ListView
    Android笔记:去除标题栏
    Android笔记:内部类
  • 原文地址:https://www.cnblogs.com/cb1186512739/p/12738173.html
Copyright © 2020-2023  润新知