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 }*/