首页 > 其他 > 详细

021 Callable接口

时间:2018-05-07 22:35:15      阅读:200      评论:0      收藏:0      [点我收藏+]

一 .概述

  在前面,我们创建线程总是需要实现run()方法,无论继承还是实现run()方法.

  我们首先看一下run()方法的结构.  

 public  void run();

  我们首先看到的是run()方法没有返回值,没有异常声明.

  这也就决定我们使用run()方法会有一点麻烦的地方.

  [1]返回值我们需要特殊处理

  [2]异常的问题有些麻烦,尽管我们可以使用UncaughtExceptionHandler来处理.


 

二 .问题的解决

  从JDK1.5之后出现了Callable接口,可以解决上面的麻烦.

  我们首先观看一下该接口的定义:  

@FunctionalInterface
public interface Callable<V> {

    V call() throws Exception;
}

我们发现该接口有了返回值,还有了异常的声明.


 

三 .Callable接口的使用  

public class CallableTest {
    
    static class Caller implements Callable<Integer>{

        @Override
        public Integer call() throws Exception {
            int count = 0 ;
            TimeUnit.SECONDS.sleep(3);
            for(int x = 0;x<100;x++) {
                count ++;
            }
            return count;
        }
    }
    
    public static void main(String[] args) throws Exception {
        //创建线程池
        ExecutorService ex = Executors.newCachedThreadPool();
        Future<Integer> future = ex.submit(new Caller());
        ex.shutdown();
        System.out.println("获取结果count:" + future.get());
        System.out.println("结果获取完毕");
    }
}

  上面的例子演示了Callable接口的使用,本质上讲和Runnable中的run()方法的使用时一致的,一般情况下都是配合线程池的使用.

  线程池的使用在这里不做多说了.

  我们可以看到一旦提交了线程任务之后就可以获得一个Futrure对象,这个对象包含返回值对象.

  也就是说我们可以通过这个对象获取到返回值,这个故意多加了最后一句,我们方法上述代码在执行的过程之中等待了一会,说明Future的get()方法是阻塞式的.

  下面一节,说一下Future的内容.

021 Callable接口

原文:https://www.cnblogs.com/trekxu/p/9005173.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!