这个demo,是我学习的demo。看了一个教程视频,照着敲出来的。
这都是老早的事情了。
咋今天才贴出来呢?是因为有个同事,让我教教他关于线程的知识,我就在自己敲的学习代码中把它给翻出来了。
本来还挺有自信的,自己敲出来的代码,讲起来,肯定是有条有理,滔滔不绝的通畅!
可实际说起来,就结结巴巴,讲讲,停停,想想,再讲讲……打击啊!
这也令我挺感慨,知识是学着忘着,但是不能停下来,因为遇到问题的时候,最起码你知道哪儿有看过的资料可以查询。
曾经画过关于这段代码的类图,但是没整理,弄丢了。
最近苏州昆山宝马碰到非机动车道上的自行车,宝马车主是一个身上纹满文身的矮胖子,自行车主是位白衬衫的中年男子。矮胖车主特别嚣张,对自行车主拳打脚踢,更甚的是,后来又从车里掏出刀来。结果打斗中,矮胖车主刀掉落在地上,被自行车主先抢到,并且矮胖车主被自行车主砍了几刀。矮胖车主,抢救无效,死亡。自行车主目前被警方控制。
这件事情发生的现场视频被曝光出来,震动全国。绝大多数网友对自行车主表示同情,认为自行车主属于正当防卫,应该无罪释放。更有网友说,应该给自行车主颁发为民除害的英雄奖,给与现金奖励。
这明显是正当防卫!
package eightthree3;
public interface Data {
String getRequest();
}
package eightthree3;
public class RealData implements Data{
private String result;
public RealData(String query){
System.out.println("根据"+query+"进行查询,这是一个耗时的操作……");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("操作完毕,获得结果");
result = "我是结果";
}
@Override
public String getRequest() {
return result;
}
}
package eightthree3;
/**
* Future模式有点类似于商品订单,比如在网购时,当看中某一件商品时,
* 就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说,
* 更形象的我们发送ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其它内容
* @author 180719-2
*
*/
public class FutureClient {
public Data request(final String querystr){
//我想要一个代理对象Data借口实现类,先返回给发送请求的客户端,告诉它请求已经接收到,可以做其他事情
final FutureData futureData = new FutureData();
//启动一个新线程,去加载一个真实的数据,传递给这个代理对象
new Thread(new Runnable() {
@Override
public void run() {
RealData realData = new RealData(querystr);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}
package eightthree3;
public class FutureData implements Data{
private RealData realData;
private boolean isReady = false;
public synchronized void setRealData(RealData realData){
//如果已经装载完毕了,就直接返回
if(isReady){
return;
}
//如果没装载,进行装载真实对象
this.realData = realData;
isReady = true;
notify();
}
@Override
public synchronized String getRequest() {
//如果没有装载好,程序就一直处于阻塞状态
while(!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//装载好直接返回数据就好
return this.realData.getRequest();
}
}
package eightthree3;
import org.junit.Test;
public class FutureTest {
@Test
public void testOne(){
FutureClient fc = new FutureClient();
Data data = fc.request("请求参数");
System.out.println("请求发送成功");
System.out.println("做其它的事情");
String result = data.getRequest();
System.out.println(result);
}
}