提货单模式,其实就是拥有回调的线程模式。

    平时我们开发用这样的,是否运行完毕我们不知道。没有回到啊。

    1. new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. }
    5. }).start();

    面对这个不靠谱的行为,我们需要一个回调给我们。

    生活中这样的事情太多了,你被一个漂亮的老师忽悠去参加Android培训班,然后你就交钱了,她给你开了收据,说等通知开学吧。来的时候记得带上这个收据。留下一个美丽的背影给你。还给你约好开学一起吃饭,等等。

    我们用 Runnable 不好实现吧,要开班了,你还在家打游戏呢。

    所以我们就需要 Future。

    说明了这个原理也很简单。就是先给你一个假的对象,可以叫代理对象。不管新线程是否运行完毕都会给你返回这个,你可以通过这个代理对象来查询是否已经完事,如果完毕你就调用这个代理对象的获取信息方法。方便吧~~

    运用也很简单。

    1. Callable ca1 = new Callable(){
    2. @Override
    3. public String call() throws Exception {
    4. try {
    5. Thread.sleep(1000);
    6. } catch (InterruptedException e) {
    7. e.printStackTrace();
    8. }
    9. return "完毕";
    10. }
    11. };
    12. FutureTask<String> ft1 = new FutureTask<String>(ca1);
    13. new Thread(ft1).start();

    当然我们自然是要自己实现一下了,不然还有啥意义呢?你说是吧。这才是真香。
    Data 接口,一真一假Data实现类。通过 Host ,先返回一个 FutureData,线程运行完毕的时候给 FutureData 赋值 真正的Data RealData。

    1. public interface Data {
    2. boolean isAvail() ;
    3. String getContext();
    4. }
    1. public class Host {
    2. public Data request(int i, String a) {
    3. FutureData futureData = new FutureData();
    4. new Thread(new Runnable() {
    5. @Override
    6. public void run() {
    7. try {
    8. Thread.sleep(2000);
    9. RealData realData = new RealData(a, i);
    10. futureData.setRealData(realData);
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. }).start();
    16. return futureData;
    17. }
    18. }
    1. public class RealData implements Data {
    2. String name;
    3. int count;
    4. public RealData(String name, int count) {
    5. this.name = name;
    6. this.count = count;
    7. }
    8. @Override
    9. public boolean isAvail() {
    10. return true;
    11. }
    12. @Override
    13. public String getContext() {
    14. return name + "--" + count;
    15. }
    16. }
    1. public class FutureData implements Data {
    2. boolean available;
    3. Data data;
    4. public boolean isAvail() {
    5. return available;
    6. }
    7. @Override
    8. public String getContext() {
    9. if (data != null) {
    10. return data.getContext();
    11. }
    12. return null;
    13. }
    14. public void setRealData(Data data) {
    15. this.data = data;
    16. available = true;
    17. }
    18. }
    1. public class Main {
    2. public static void main(String[] args) {
    3. Host host = new Host();
    4. Data data1 = host.request(10, "A");
    5. while (!data1.isAvail()){
    6. try {
    7. Thread.sleep(10);
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    11. }
    12. System.out.println(data1.getContext());
    13. }