码迷,mamicode.com
首页 > 其他好文 > 详细

021 Callable接口

时间:2018-05-07 22:47:38      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:jdk   throws   JD   sys   例子   jdk1.5   handle   获取   BMI   

一 .概述

  在前面,我们创建线程总是需要实现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接口

标签:jdk   throws   JD   sys   例子   jdk1.5   handle   获取   BMI   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!