package com.example.demo.AQS;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @program: demo
* @description: future
* @author: 郭雄帅
* @create: 2021-01-27 09:56
*/
public class FutureDemo {
static ExecutorService executors= Executors.newScheduledThreadPool(2);
public static void main(String[] args) {
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
return "lalala";
}
};
JackFuture<String> futureTask = new JackFuture<>(callable);
new Thread(futureTask).start();
System.out.println(futureTask.getResult());
}
}
下面的代码参考java.util.concurrent.FutureTask源码
package com.example.demo.AQS;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.LockSupport;
/**
* @program: demo
* @description:FutureTask的核心思想
* @author: 郭雄帅
* @create: 2021-01-27 09:57
*/
public class JackFuture<T> implements Runnable{
private Callable<T> callable;
T result;
volatile String status = "NEW";
LinkedBlockingQueue<Thread> queue = new LinkedBlockingQueue<>();
public JackFuture(Callable<T> callable) {
this.callable = callable;
}
public T getResult() {//阻塞,run方法执行完毕之后
System.out.println("执行get");
if ("END".equals(status)){
return result;
}
while (!"END".equals(status)){//run未完成,执行阻塞
//准备一个容器,存放线程
queue.offer(Thread.currentThread());
LockSupport.park();
}
return result;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"+执行run");
result = callable.call();
} catch (Exception e) {
e.printStackTrace();
}finally {
status="END";
}
Thread thread = queue.poll();
while (thread!=null){
LockSupport.unpark(thread);
thread = queue.poll();//直到全部取出,结束循环
}
}
}
```又学到了!