自定义Callable获取线程返回值

简单看了一下:Callable,FutureTask 的源码,就简单的实现了一下

一、定义一个接口 MyCallable

/**
 * @description callable 接口
 * @author: BlackSoil
 * @date: 2022-11-17  17:20
 * @version: 1.0
 */
public  interface MyCallable{
    T call();
}

二、定义自己的线程类 MyFutureTask

/**
 * 实现原理:
 * 启动线程会默认调用 run 方法,我在 run 方法调用我自己的方法实现(call),并且得到返回值
 * 在 get 方法获取返回值时,判断 call 方法是否已经运行完毕,返回返回值,取值返回
 * @author: BlackSoil
 * @date: 2022-11-17  17:29
 * @version: 1.0
 */
public class MyFutureTask implements Runnable{

    /**
     * 具体需要执行的任务
     */
    private MyCallable myCallable;

    /**
     * 返回值
     */
    private T result;

    /**
     * 是否调用完成
     * volatile 保证修改以后其他线程可见
     */
    private static volatile boolean COMPLETING   = false;

    public MyFutureTask(MyCallable myCallable) {
        this.myCallable = myCallable;
    }

    @Override
    public void run() {
        //运行任务
        result = myCallable.call();
        //标识调用用户方法完成,准备返回返回值
        COMPLETING = true;
    }


    public T get(){
        //用于等待 call 方法调用完成
        while (!COMPLETING){}
        return result;
    }
}

三、测试

public class TestMain implements MyCallable {


    @Override
    public String call() {
        System.out.println(Thread.currentThread().getName() + ": 通过实现Callable接口的方式正在运行");
        return "666";
    }


    public static void main(String[] args) {
        MyCallable myCall = new TestMain();
        MyFutureTask myFutureTask = new MyFutureTask<>(myCall);
        Thread thread = new Thread(myFutureTask, "下沉");
        thread.start();
        System.out.println("获取返回值:"+myFutureTask.get());
    }

}

四、展示运行结果


image.png

你可能感兴趣的:(自定义Callable获取线程返回值)