• 5.创建执行线程的方式之三 :实现Callable 接口


    Callable 接口

      一、Java 5.0 在 java.util.concurrent 提供了 一个新的创建执行线程的方式(之前有继承Thread 和 实现Runnable):Callable 接口

    Callable 接口类似于 Runnable ,两者都是为那些其 实例 可能被另外一个线程执行的类设计的。但是 Runnable 接口的 run方法,不会有返回值,并且无法抛出结果检查的异常

      二、执行 Callable 方式 ,需要FutureTask 实现类的支持,用于接收运算结果(call方法的返回值),FutureTask 是 Future 接口的实现类
    FutureTask.get() 获取结果的前提是, 线程进行了运算,即执行了 call 方法,所以FutureTask也可以用作闭锁

     1 /*
     2  *一、创建执行线程的方式之三 :实现Callable 接口 
     3  * 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常
     4  * 二、执行 Callable 方式 ,需要FutureTask 实现类的支持,用于接收运算结果(call的返回值)
     5  * FutureTask 是 Future 接口的实现类
     6  * */
     7 public class TestCallable {
     8     public static void main(String[] args) {
     9         CallableThread ct = new CallableThread();
    10         //1.执行 Callable 方式 ,需要FutureTask 实现类的支持,用于接收运算结果(call的返回值)
    11         FutureTask<Integer> result = new FutureTask<Integer>(ct);
    12         
    13         new Thread(result).start();
    14         
    15         //2.接收线程运算后的结果,
    16         //result.get() 获取结果的前提是, 线程进行了运算,即执行了 call 方法,
    17         //否则result.get(); 是会阻塞的 ,无法结束;  这也很好理解,一定要返回结果,才能接收嘛!
    18         try {        
    19             Integer sum = result.get();  //所以 FutureTask 也可用于 闭锁 (等某个线程计算完成后,才能继续执行这个操作)
    20             System.out.println(sum);
    21         } catch (Exception e) {
    22             e.printStackTrace();
    23         }
    24 
    25     }
    26 }
    27  
    28 class CallableThread implements Callable<Integer> {     //在实现接口指定的泛型即为返回值类型
    29 
    30     //实现接口时指定的 类型,就是 call 方法的返回值类型
    31     @Override
    32     public Integer call() throws Exception {
    33         int sum = 0;
    34         for(int i = 0;i < 10;i++) {
    35             System.out.println(i);
    36             sum = sum + i;
    37         }
    38         return sum;
    39     }
    40     
    41 }
    42 /*
    43 class CallableThread implements Runnable {
    44     @Override
    45     public void run() {
    46     }
    47 }*/
  • 相关阅读:
    Vim自动补全神器YouCompleteMe的配置
    sudo apt-get update 时出现的hit、ign、get的含义
    C语言可变参数宏及‘##’在可变参数中的作用
    搬书游戏
    程序中数字取反结果公式
    利用宏定义中的##实现函数模板的作用
    C中的空宏定义,即只有一个参数
    浏览器缓存技术介绍
    Vue相关原理以及手写一个MyVue
    详解JS中的prototype、__proto__与constructor(图解)
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7428749.html
Copyright © 2020-2023  润新知