前言
生活中我们为了完成一件事或者达成一个目标,常常需要别人来帮助,比如:我们要定制某个商品,我们需要商家去帮我们定制完成。再比如,我们要去干洗店洗衣间棉袄。正常情况下我们不会傻乎乎的等商家帮我们定制完成商品,或者让干洗店洗完棉袄,我们才去干自己的事情。一般我们都是把事情交给别人后,直接去干自己的事情了,等我们忙完自己的事情之后再去店里取订制品或者棉袄,或者让商家直接给我们寄回家。java并发编程种模拟这种实际情况,于是就有了未来设计模式(Future Design pattern)
一、什么是未来设计模式?
未来设计模式就是,我们把事情交给别人,自己直接先去干别的事情,在未来的某个时间我们才去哪交给别人去做的事情的结果,或者让消费者在别人完成我们的事情后消费掉这个结果。
二、代码示例
1.Future
定义Future接口,定义get()方法,用来获取我们想要的结果
package future;
public interface Future<T> {
T get() throws InterruptedException;
}
2.Future实现类
实现get方法,定义done方法
package future;
public class AsyncFuture<T> implements Future<T> {
private volatile boolean done = false;
private T result;
public synchronized void done(T result) {
this.result = result;
this.done = true;
this.notifyAll();
}
@Override
public synchronized T get() throws InterruptedException {
while (!done) {
this.wait();
}
return result;
}
}
3.FutureService
Future服务类,定义submit方法,用来提交任务(相当于我们的任务交给别人)
package future;
import java.util.function.Consumer;
public class FutureService {
public <T> Future<T> submit(FutureTask<T> task, Consumer<T> consumer) {
AsyncFuture<T> asyncFuture = new AsyncFuture<>();
new Thread(() -> {
T result = null;
try {
result = task.call();
asyncFuture.done(result);
consumer.accept(result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
return asyncFuture;
}
}
4.FutureTask
定义任务,函数式接口
package future;
public interface FutureTask<T> {
T call() throws InterruptedException;
}
5.客户端
定义任务,函数式接口
package future;
public class FutureClient {
public static void main(String[] args) throws InterruptedException {
FutureService futureService = new FutureService();
futureService.submit(() -> {
Thread.sleep(10000L);
return "HELLO FUTURE";
}, System.out::println);
System.out.println("====================");
Thread.sleep(1000L);
System.out.println("主线程执行结束了");
}
}
6.执行结果
主线程没有被阻塞,直接往下执行,同时,我们的任务也同时执行,10s后我们的任务完成,记过被消费,打印出来
====================
主线程执行结束了
HELLO FUTURE