Callable实现带有返回值的线程

来源:互联网 发布:波利亚计数定理 知乎 编辑:程序博客网 时间:2024/05/22 04:37

我们都知道线程是没有返回值的,在Runnable接口中,只有一个抽象的Run方法,使用Callable我们能够实现带有返回值得的线程,下面是一个demo

/** *  */package com.mingrisoft.threadone;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class Test {       int value=100;//账户钱    public static void main(String[] args) {        // TODO Auto-generated method stub    new Test();    }    public Test() {        Thread thread=new Thread(new FutureTask<>(new run()));        Thread thread2=new Thread(new FutureTask<>(new run1()));        thread.start();        thread2.start();    }    class run implements Callable<Integer>{        @Override        public Integer call() throws Exception {            //在这里实现计算            for(int i=0;i<10;i++){                value+=10;                System.out.println("run一的计算结果为:"+value);            }            return value;        }    }    class run1 implements Callable<Integer>{        @Override        public Integer call() throws Exception {            for(int i=0;i<10;i++){                value+=10;                System.out.println("run2一的计算结果为:"+value);            }            return value;        }    }}

具体就不讲解喽,大家可以查看官方文档,现在我们来看看打印结果
这里写图片描述

我们发现同时运行,线程2居然被阻塞了,通过着我们发现可以通过这实现异步计算,
上面我们创建了FutureTask对象,FutureTask实现了Runnable接口
官方给出这样的说明
可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。
那么说了,如果计算没有完成,就会阻塞get方法,先我们来测试一下
修改程序的代码:

/** *  */package com.mingrisoft.threadone;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class Test {       int value=100;//账户钱    public static void main(String[] args) {        // TODO Auto-generated method stub    new Test();    }    public Test() {        FutureTask<Integer> future=new FutureTask<>(new run());        FutureTask<Integer> future1=new FutureTask<>(new run1());        Thread thread=new Thread(future);        Thread thread2=new Thread(future1);        thread.start();        thread2.start();            try {                int i=future.get();                int j=future1.get();                System.out.println("i的计算结果为:"+i);                System.out.println("j的计算的结果为:"+j);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (ExecutionException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }    }    class run implements Callable<Integer>{        @Override        public Integer call() throws Exception {            //在这里实现计算            for(int i=0;i<10;i++){                value+=10;            //  System.out.println("run一的计算结果为:"+value);            }            return value;        }    }    class run1 implements Callable<Integer>{        @Override        public Integer call() throws Exception {            for(int i=0;i<10;i++){                value+=10;            //  System.out.println("run2一的计算结果为:"+value);            }            return value;        }    }}

这里写图片描述

原创粉丝点击