简单看了一下:Callable,FutureTask 的源码,就简单的实现了一下
一、定义一个接口 MyCallable
/**
* @description callable 接口
* @author: BlackSoil
* @date: 2022-11-17 17:20
* @version: 1.0
*/
public interface MyCallable<T>{
T call();
}
二、定义自己的线程类 MyFutureTask
/**
* 实现原理:
* 启动线程会默认调用 run 方法,我在 run 方法调用我自己的方法实现(call),并且得到返回值
* 在 get 方法获取返回值时,判断 call 方法是否已经运行完毕,返回返回值,取值返回
* @author: BlackSoil
* @date: 2022-11-17 17:29
* @version: 1.0
*/
public class MyFutureTask<T> implements Runnable{
/**
* 具体需要执行的任务
*/
private MyCallable<T> myCallable;
/**
* 返回值
*/
private T result;
/**
* 是否调用完成
* volatile 保证修改以后其他线程可见
*/
private static volatile boolean COMPLETING = false;
public MyFutureTask(MyCallable<T> 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<String> {
@Override
public String call() {
System.out.println(Thread.currentThread().getName() + ": 通过实现Callable接口的方式正在运行");
return "666";
}
public static void main(String[] args) {
MyCallable<String> myCall = new TestMain();
MyFutureTask<String> myFutureTask = new MyFutureTask<>(myCall);
Thread thread = new Thread(myFutureTask, "下沉");
thread.start();
System.out.println("获取返回值:"+myFutureTask.get());
}
}
四、展示运行结果

网友评论