线程返回值问题

来源:互联网 发布:ios9.3.3数据精灵 编辑:程序博客网 时间:2024/05/19 05:39

平时我们写Java程序或者是Android程序的时候有这样一个问题,耗时操作我们需要写到线程里面去,但是一旦写到线程里面去,我们又会发现很难获得返回值,当然天无绝人之路 我们可以通过 EventBus框架传值过去,也可以通过Handle传值过去,同样也可以自己写回调接口。


今天我教大家一个直接调用方法获取线程里面的耗时操作方法

1,首先我们可以准好好耗时操作

** *  * 线程返回一个List数据,在这里这个类没有run()方法,但是我们可以把它看成一个线程 * */public class QueryDataThread implements Callable<List<Map<String,Object>>>{    private Map<String,Object> param = null ;    public QueryDataThread(Map<String,Object> param){        super();        this.param = param;    }    public List call() throws Exception {          /* 模拟查询DB后得到结果集合 */        System.out.println("param -> " + param);        Map<String, Object> map1 = new HashMap<String, Object>();        map1.put("id", "1001");        map1.put("name", "nick huang");        Map<String, Object> map2 = new HashMap<String, Object>();        map2.put("id", "1002");        map2.put("name", "darren lin");        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();        list.add(map1);        list.add(map2);        /* 设置短暂的睡眠以便观察效果 */        try {            TimeUnit.SECONDS.sleep(3);        } catch (InterruptedException e) {            e.printStackTrace();        }        return list;    }}

怎么用呢,我们在新建一个Test类

        // 因为需要一个Map集合,所以这里创建一个我们传进去         Map<String,Object> myMap = new HashMap<>();        // 创建一个ExecutorService 的实例,从后面的名字我们可以理解为缓冲线程池          ExecutorService  exectorExecutorService =            Executors.newCachedThreadPool();          QueryDataThread  queryDataThread = new QueryDataThread(myMap);          //下面就是比较关键的代码 我们可以理解位开启线程之后        /** 这里是submit的源码介绍,开启了一个Runnable,返回一个Future     * Submits a Runnable task for execution and returns a Future     * representing that task. The Future's {@code get} method will     * return {@code null} upon <em>successful</em> completion.     *     * @param task the task to submit     * @return a Future representing pending completion of the task     * @throws RejectedExecutionException if the task cannot be     *         scheduled for execution     * @throws NullPointerException if the task is null     */    Future<?> submit(Runnable task);          Future<List<Map<String, Object>>> resultFuture =                   exectorExecutorService.submit(queryDataThread);          System.out.println("size==="+resultFuture.get().size());          System.out.println("size==="+resultFuture.get().get(0).get("name"));//返回的情况位param -> {}size===2size===nick huang
原创粉丝点击