java异步与多线程

异步与多线程,从辩证关系上来看,异步和多线程并不时一个同等关系,异步是目的,多线程只是我们实现异步的一个手段.
什么是异步:异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回.实现异步可以采用多线程技术或则交给另外的进程来处理.

在JAVA平台,实现异步调用的角色有如下三个角色:调用者 提货单 真实数据一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单.然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕,不需要等蛋糕做出来(假设现做要很长时间),只需要领个提货单就可以了(去干别的事情),等到蛋糕做好了,再拿提货单取蛋糕就可以了。
顾客、蛋糕店、蛋糕师、提货单四个类
顾客:
main{
Host host = new Host();
Data data1 = host.request(10,'A');
Data data2 = host.request(10,'B');

Thread.sleep(200);
System.out.println("完成其他工作");
System.out.println("data1 = " + data1.getContent());//享用蛋糕,这个方法在做好蛋糕之前会阻塞顾客线程。
System.out.println("data2 = " + data2.getContent());
}
蛋糕店:
Host{
request(int count,char c){
//建立提货单的实体
FutureData future = new FutureData();
//为了建立蛋糕的实体,启动新的线程
new Thread() {
public void run() {
RealData realdata = new RealData(count, c);
future.setRealData(realdata);
}}.start
return future;//返回提货单
}
}
蛋糕师:
RealData{
拉蛋糕的耗时操作
成员变量content,存储蛋糕;
}
提货单:
FutureData{
private RealData realdata = null;
private boolean ready = false;
synchronized void setRealData(RealData realdata) {//这里有两个同步方法,避免顾客A与其对应的面包师A同时操作。
if (ready) {return;}//只能设置一次
this.realdata = realdata;
this.ready = true;
}
synchronized String getContent() {//当一个线程访问object的一个synchronized代码块时,其他线程对object中所有其它同步代码块的访问被阻塞。
while(!ready){wait()}//做好之前等
return realdata.getContent();
}
}
原文:http://java.chinaitlab.com/line/839154_2.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值