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 }*/
原文地址:https://www.cnblogs.com/xuzekun/p/7428749.html