(1)Callable接口更像是Runnable接口的增强版,相比较Runable接口,Call()方法新增捕获和抛出异常的功能;Call()方法可以返回值<br> (2)Future接口提供了一个实现类FutureTask实现类,FutureTaks类用来保存Call()方法的返回值,并作为Thread类的target。<br> (3)调用FutureTask的get()方法来获取返回值 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * (1)创建Callable接口的实现类,并重写call()方法,该call()方法作为线程的执行体,且有返回值 * (2)创建了Callable接口的实现类的实例,并用FutureTask()方法包装对象,该FutureTask()对象实现了 * 将对象的返回值包装的功能 * (3)使用FutureTask对象将Thread对象的target,创建并启动线程 * (4)调用FutureTask对象的get()方法获得子线程执行结束后的返回值 * */ public class Callable_Future implements Callable<Integer> { @Override public Integer call() throws Exception { //重写Callable接口中的call()方法 int i=0; for(;i<100;i++) { System.out.println(Thread.currentThread().getName()+" "+i); } return i; } public static void main(String[] args) throws InterruptedException, ExecutionException { //创建Callable的对象 Callable_Future ca=new Callable_Future(); FutureTask<Integer> ft=new FutureTask<Integer>(ca); for(int i=0;i<100;i++) { //返回值主线程的名称和执行代号 System.out.println(Thread.currentThread().getName()+" "+i); if(i==20) { new Thread(ft,"Callable线程").start(); //该方法将导致主线程被阻塞,直到call()方法结束并返回为止 //System.out.println("子线程的返回值"+ft.get()); } } try{ System.out.println("子线程的返回值"+ft.get()); }catch (Exception e) { e.printStackTrace(); } } }