简单用法
实现 Callable 接口,核心是get()方法会调用 LockSupport的park和unpark方法,让线程阻塞,直到拿到响应的结果
package com.mayikt;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* @Description:
* @Author: ChenYi
* @Date: 2020/07/27 23:07
**/
public class CallThread implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new CallThread());
new Thread(futureTask).start();
String s = futureTask.get();
System.out.println(s);
}
@Override
public String call() throws Exception {
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + "发送短信完成>>>");
return "发送短信成功>>>";
}
}
手写FutureTask
package com.mayikt.call;
/**
* @Description:
* @Author: ChenYi
* @Date: 2020/07/27 23:30
**/
public interface MayiktCallable<V> {
V call();
}
package com.mayikt.call;
/**
* @Description:
* @Author: ChenYi
* @Date: 2020/07/27 23:38
**/
public class MyCallableThread implements MayiktCallable<String> {
@Override
public String call() {
try {
System.out.println(Thread.currentThread().getName() + "短信发送");
Thread.sleep(3000);
return "短信发送成功>>>";
} catch (InterruptedException e) {
return "短信发送失败>>>";
}
}
}
package com.mayikt.call;
import java.util.Objects;
import java.util.concurrent.locks.LockSupport;
/**
* @Description:
* @Author: ChenYi
* @Date: 2020/07/27 23:36
**/
public class MayiktFutureTask<V> implements Runnable {
private MayiktCallable<V> callable;
private V result;
private Thread currentThread;
public MayiktFutureTask(MayiktCallable<V> callable) {
this.callable = callable;
}
@Override
public void run() {
try {
result = callable.call();
if (Objects.nonNull(result)) {
LockSupport.unpark(currentThread);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public V get() {
if (Objects.nonNull(result)) {
return result;
}
currentThread = Thread.currentThread();
LockSupport.park();
return result;
}
}
参考:蚂蚁课堂