Future设计模式

        Future设计模式,针对长时间执行任务场景,提供了一种凭据式解决方案。Future提供了获取计算结果和判断是否完成的两个方法,其中获取计算结果将会导致调用阻塞(在任务未完成的情况下)。

示例代码如下:

public interface Future<T> {
//get result
T get() throws InterruptedException;
// task is done or not
boolean done();
}
//配置任务的入参类型和返回参数类型
public interface Task<IN,OUT> {
OUT get(IN input);//确定IN和OUT的关系
}
public class FutureTask<T> implements Future<T>{
private T result;
private boolean isDone=false;
private final Object LOCK=new Object();

@Override
public T get() throws InterruptedException {
synchronized(LOCK) {
while(!isDone) {
LOCK.wait();
}
return result;
}
}

protected void finish(T result) {
synchronized(LOCK) {
if(isDone)return;
this.result=result;
this.isDone=true;
LOCK.notifyAll();
}
}

@Override
public boolean done() {
return isDone;
}

}
public interface FutureService<IN,OUT> {
Future<?> submit(Runnable runnable);
Future<OUT> submit(Task<IN,OUT> task, IN input);
static <T,R> FutureService<T,R> newService(){
return new FutureServiceImpl<>();
}
}
import java.util.concurrent.atomic.AtomicInteger;

public class FutureServiceImpl<IN, OUT> implements FutureService<IN,OUT>{
private final String FUTURE_THREAD_PREFIX="FUTURE-";
private final AtomicInteger nextCounter=new AtomicInteger(0);
private String getNextName() {
return this.FUTURE_THREAD_PREFIX+this.nextCounter.getAndIncrement();
}
@Override
public Future<?> submit(Runnable runnable) {
final FutureTask<Void> future=new FutureTask<>();
new Thread(()->{
runnable.run();
future.finish(null);
},this.getNextName()).start();
return future;
}

@Override
public Future<OUT> submit(Task<IN, OUT> task, IN input) {
final FutureTask<OUT> future=new FutureTask<>();
new Thread(()->{
OUT result=task.get(input);
future.finish(result);
},this.getNextName()).start();
return future;
}

}
import java.util.concurrent.TimeUnit;

public class FTest {

public static void main(String[] args) {
FutureService<Void,Void> service=FutureService.newService();
Future<?> future=service.submit(()->{
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("done the future task.");
});
try {
System.out.println(future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FutureService<String,Integer> s=FutureService.newService();
Future<Integer> f=s.submit(input->{
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return input.length();
}, "Hello");
try {
System.out.println(f.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值