future的简单实现

一 .入门

相信大家使用过线程,对future应该不会陌生吧! 在java一种最简单的使用是Callable,比如:

public class A implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "aaa";
    }
}
@org.junit.Test
public void test3() throws ExecutionException, InterruptedException {
    ExecutorService service = Executors.newSingleThreadExecutor();
    Future<String> restult = service.submit(new A());
    System.out.println(restult.get());
}

这样结果就输出了

aaa

很简单吧,现在来简单讲解下future的使用。

二. 理解future

future模式是一种异步获取结果的方式

public interface Future<V> {

    boolean cancel(boolean mayInterruptIfRunning);  //任务取消

    boolean isCancelled();  //判断是否取消

    boolean isDone();  //是否已经做完

    V get() throws InterruptedException, ExecutionException;  //获取值

    V get(long timeout, TimeUnit unit)   //带超时的获取值
        throws InterruptedException, ExecutionException, TimeoutException;
}

feture的使用一般使用线程池来获取值。


现在来简单梳理一下调用逻辑

线程池一般都会继承ExecutorService,最终会执行到ThreadPoolExecutor的execute方法,之后利用BlockingQueue来获取值。它里面用的是Condition的await和signal方法。由于对象的await和notify方法和它们类似。那本篇主要使用await和notify来实现future的功能。

三.future 代码实现

public interface IData {  //定义数据接口
    RealData getResult();
}
public class RealData implements IData {  //定义

    private String data;  

    public RealData(String name) {
        try {
            TimeUnit.SECONDS.sleep(2);  //模仿耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        data = "init finish!" + name;  //赋值
    }

    @Override
    public RealData getResult() {
        return this;
    }

    public String getData() {  //返回最后添加的值
        return data;  
    }
}
public class FutureData implements IData {  //futureData 实现类
    private RealData realData = null;  

    public void setRealData(RealData realData) {
        this.realData = realData;
        synchronized (this) {  //同步代码块
            notifyAll();  //通知所有阻塞线程
        }
        System.out.println("值设置成功!");
    }

    @Override
    public RealData getResult() {
        try {
            synchronized (this) { //同步代码块
                wait();           // 阻塞,如果值执行完,由notify唤醒
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return realData;
    }

}
public class FutureClint {

    public FutureData init(String result) {  //使用线程的方式初始化值
        FutureData futureData = new FutureData();
        new Thread(new Runnable() {
            @Override
            public void run() {
                RealData realData = new RealData("result");
                futureData.setRealData(realData);
            }
        }).start();
        return futureData;  //这里是异步返回的
    }
}
@org.junit.Test
public void futureDataTest() throws InterruptedException {
    FutureClint futureClint = new FutureClint();
    FutureData data = futureClint.init("future test");
    System.out.println("get data");  
    System.out.println("result:"+data.getResult().getData());
}

结果

get data     //这里结果输出之后应该会等2秒,
值设置成功!
result:init finish!result  //异步通知,这里的值会输出

四.总结

       需要使用到对象的await和notify方法,以及线程,实现方法有点类似静态代理模式,又有点策略模式的影子。先需要初始化一个真实的对象,然后在线程里面讲这个对象赋值给future对象,这样就可以直接返回future对象,在输出future对象的属性值时,需要通知当前阻塞的线程往下执行!


Flutter中,可以使用Future实现倒计时功能。下面是一个使用Future实现倒计时的代码示例: ```dart import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '倒计时示例', theme: ThemeData( primarySwatch: Colors.blue, ), home: CountDownPage(), ); } } class CountDownPage extends StatefulWidget { @override _CountDownPageState createState() => _CountDownPageState(); } class _CountDownPageState extends State<CountDownPage> { int countDownValue = 10; @override void initState() { super.initState(); startCountDown(); } void startCountDown() { Future.delayed(Duration(seconds: 1), () { setState(() { countDownValue--; }); if (countDownValue > 0) { startCountDown(); } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('倒计时示例'), ), body: Center( child: Text( '倒计时:$countDownValue', style: TextStyle(fontSize: 24), ), ), ); } } ``` 上述代码展示了如何创建一个名为CountDownPage的StatefulWidget,其中使用Future.delayed来实现倒计时的逻辑。在initState中调用了startCountDown方法来启动倒计时,每秒减少countDownValue的值,并通过setState来更新页面。当countDownValue为0时,停止倒计时。 在构建页面时,使用了Center和Text组件来展示倒计时的数值。 通过这种方式,我们可以在Flutter中使用Future实现简单的倒计时功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值