Callable创建线程

(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();
        }

    }
}

  

posted @ 2019-07-03 09:23  黑魔法os  阅读(2850)  评论(0编辑  收藏  举报