提货单模式,其实就是拥有回调的线程模式。
平时我们开发用这样的,是否运行完毕我们不知道。没有回到啊。
new Thread(new Runnable() {@Overridepublic void run() {}}).start();
面对这个不靠谱的行为,我们需要一个回调给我们。
生活中这样的事情太多了,你被一个漂亮的老师忽悠去参加Android培训班,然后你就交钱了,她给你开了收据,说等通知开学吧。来的时候记得带上这个收据。留下一个美丽的背影给你。还给你约好开学一起吃饭,等等。
我们用 Runnable 不好实现吧,要开班了,你还在家打游戏呢。
所以我们就需要 Future。
说明了这个原理也很简单。就是先给你一个假的对象,可以叫代理对象。不管新线程是否运行完毕都会给你返回这个,你可以通过这个代理对象来查询是否已经完事,如果完毕你就调用这个代理对象的获取信息方法。方便吧~~
运用也很简单。
Callable ca1 = new Callable(){@Overridepublic String call() throws Exception {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return "完毕";}};FutureTask<String> ft1 = new FutureTask<String>(ca1);new Thread(ft1).start();
当然我们自然是要自己实现一下了,不然还有啥意义呢?你说是吧。这才是真香。
Data 接口,一真一假Data实现类。通过 Host ,先返回一个 FutureData,线程运行完毕的时候给 FutureData 赋值 真正的Data RealData。
public interface Data {boolean isAvail() ;String getContext();}
public class Host {public Data request(int i, String a) {FutureData futureData = new FutureData();new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000);RealData realData = new RealData(a, i);futureData.setRealData(realData);} catch (InterruptedException e) {e.printStackTrace();}}}).start();return futureData;}}
public class RealData implements Data {String name;int count;public RealData(String name, int count) {this.name = name;this.count = count;}@Overridepublic boolean isAvail() {return true;}@Overridepublic String getContext() {return name + "--" + count;}}
public class FutureData implements Data {boolean available;Data data;public boolean isAvail() {return available;}@Overridepublic String getContext() {if (data != null) {return data.getContext();}return null;}public void setRealData(Data data) {this.data = data;available = true;}}
public class Main {public static void main(String[] args) {Host host = new Host();Data data1 = host.request(10, "A");while (!data1.isAvail()){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(data1.getContext());}
