package com.day03;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @author anyan
 * @date 2021/5/15-22:03
 */
/*
实现线程执行的第三种方式:实现Callable接口
 */
public class FutureTaskTest {
    public static void main(String[] args) throws Exception {
        //新建未来任务对象,以匿名内部类的方式实现Callable接口
        FutureTask ftt=new FutureTask(new Callable() {
            //call方法返回值为一个Obeject对象,相当于线程中的run()方法,区别在于返回值类型
            @Override
            public Object call() throws Exception {
                System.out.println("call method begin");
                Thread.sleep(1000*4);
                System.out.println("call method over");
                int a=1;
                int b=2;
                return a+b;
            }
        });
        Thread t=new Thread(ftt);
        t.start();
        Object obj=ftt.get();//获取返回值类型对象
        //此方式有个缺陷:未来任务线程在调用get()返回值方法时,会阻碍main 线程的执行
        //以下代码必须先等待ftt.get()执行结束才能执行,而get()方法执行时间往往比较长。
        System.out.println("执行结果返回值"+obj);
        System.out.println("main continue");
    }
}