
正文
java代码异步执行 java异步编程
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Java多线程实现异步调用
在JAVA平台 实现异步调用java代码异步执行的角色有如下三个角色:调用者 提货单 真实数据一个调用者在调用耗时操作 不能立即返回数据时 先返回一个提货单 然后在过一断时间后凭提货单来获取真正java代码异步执行的数据 去蛋糕店买蛋糕 不需要等蛋糕做出来(假设现做要很长时间) 只需要领个提货单就可以了(去干别的事情) 等到蛋糕做好了 再拿提货单取蛋糕就可以了 public class Main { public static void main(String[] args) {
System out println( main BEGIN );
Host host = new Host();
Data data = host request( A );
Data data = host request( B );
Data data = host request( C );
System out println( main otherJob BEGIN );
try {
Thread sleep( );
} catch (InterruptedException e) {
}
System out println( main otherJob END );
System out println( data = + data getContent());
System out println( data = + data getContent());
System out println( data = + data getContent());
System out println( main END );
}
}
这里的main类就相当于 顾客 host就相当于 蛋糕店 顾客向 蛋糕店 定蛋糕就相当于 发请求request 返回的数据data是FutureData的实例 就相当于提货单 而不是真正的 蛋糕 在过一段时间后(sleep一段时间后) 调用data getContent() 也就是拿提货单获取执行结果
下面来看一下 顾客定蛋糕后 蛋糕店做了什么
public class Host {
public Data request(final int count final char c) {
System out println( request( + count + + c + ) BEGIN );
// ( ) 建立FutureData的实体
final FutureData future = new FutureData();
// ( ) 为了建立RealData的实体 启动新的线程
new Thread() {
public void run() {
//在匿名内部类中使用count future c
RealData realdata = new RealData(count c);
future setRealData(realdata);
}
} start();
System out println( request( + count + + c + ) END );
// ( ) 取回FutureData实体 作为传回值
return future;
}
}
host( 蛋糕店 )在接到请求后 先生成了 提货单 FutureData的实例future 然后命令 蛋糕师傅 RealData去做蛋糕 realdata相当于起个线程去做蛋糕了 然后host返回给顾客的仅仅是 提货单 future 而不是蛋糕 当蛋糕做好后 蛋糕师傅才能给对应的 提货单 蛋糕 也就是future setRealData(realdata)
下面来看看蛋糕师傅是怎么做蛋糕的
建立一个字符串 包含count个c字符 为了表现出犯法需要花费一些时间 使用了sleep
public class RealData implements Data { private final String content;
public RealData(int count char c) {
System out println( making RealData( + count + + c + ) BEGIN );
char[] buffer = new char[count];
for (int i = ; i count; i++) {
buffer[i] = c;
try {
Thread sleep( );
} catch (InterruptedException e) {
}
}
System out println( making RealData( + count + + c + ) END );
ntent = new String(buffer);
}
public String getContent() {
return content;
}
}
现在来看看 提货单 future是怎么与蛋糕 content 对应的:
public class FutureData implements Data { private RealData realdata = null;
private boolean ready = false;
public synchronized void setRealData(RealData realdata) {
if (ready) {
return; // 防止setRealData被调用两次以上
}
this realdata = realdata;
this ready = true;
notifyAll();
}
public synchronized String getContent() {
while (!ready) {
try {
wait();
} catch (InterruptedException e) {
}
}
return realdata getContent();
}
}
顾客做完自己的事情后 会拿着自己的 提货单 来取蛋糕
System out println( data = + data getContent());
这时候如果蛋糕没做好 就只好等了
while (!ready) { try {
wait();
} catch (InterruptedException e) {
}
//等做好后才能取到
return realdata getContent();
程序分析
对于每个请求 host都会生成一个线程 这个线程负责生成顾客需要的 蛋糕 在等待一段时间以后 如果蛋糕还没有做好 顾客还必须等待 直到 蛋糕被做好 也就是
future setRealData(realdata); 执行以后 顾客才能拿走蛋糕
每个线程只是专门负责制作特定顾客所需要的 蛋糕 也就是顾客A对应着蛋糕师傅A 顾客B对应着蛋糕师傅B 即使顾客B的蛋糕被先做好了 顾客A也只能等待蛋糕师傅A把蛋糕做好 换句话说 顾客之间没有竞争关系
lishixinzhi/Article/program/Java/gj/201311/27425
相关问答
Q1: Java异步编程可以吗
不论是服务器端编程还是客户端编程java代码异步执行,编程中java代码异步执行的同步和异步对程序员来说都应该不陌生,java代码异步执行我们经常会用同步编程来解决顺序执行问题、用异步解决并行执行问题。然而,就是这样的常见的编程模式,有人却将其申请为专利。在谷歌专利查询网站上专利公开号为US 20140282625 A1的专利内容就是Asynchronous programming model for concurrent workflow scenarios,在这个专利的内容摘要描述有:
异步方式在编程中的执行过程是:先将包含有跟流程信息相关的全局变量和全局上下文指针存储到一个上下文结构体中。当异步函数被执行时,全局上下文指针被存储到本地变量中,当函数执行完,全局上下文指针可以从本地变量中恢复。
下面的流程图和组件图可看出这个专利中含盖的编程模式和架构。
图1
图2
专利是一把双刃剑,它能保护专利发明人的权利、鼓励更多人来发明创造,但也会因此限制其推广和普遍使用、浪费生产力。UNIX 和 BSD 的专利之争就是最恶劣的一个案例,Java 和安卓之争也给业界带来了很多的麻烦。2004 年 4 月,微软公司申请到一个专利,内容是计算机上,在一个特定时间内按下多次按键来启动应用程序,即微软为双击鼠标启动程序申请了专利。幸好微软没有动用这项专利,否则的话后果实在太恐怖了。苹果公司也申请了很多让人哭笑不得的专利,其中最奇葩的是矩形圆角外观设计专利。
苹果此前获得的诸多关于 iPhone 和 iPad 的专利中或多或少都会包含一些实际的功能,譬如 Home 键、背部轮廓设计或者前面板整体玻璃覆盖设计等。但此次获得的专利却单单专注于外观,苹果的意图很简单:圆角矩形就是苹果发明的java代码异步执行!专利所保护的圆角矩形设计,是一个非常宽泛的概念,宽泛到图中这个边框的横竖线条的比例都能成为它保护的对象,无论设备是 7 寸还是 20 寸。
专利可以用来维护原创者的权益,但是专利的尺度宽泛以及漏洞极有可能通过了一些不实用的专利而引起很多不必要的麻烦,甚至对行业的发展造成阻碍.
Q2: java异步方法什么意思
在JAVA平台,实现异步调用的角色有如下三个角色:调用者,取货凭证,真实数据
异步调用就是:一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据.
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率
只有一个马桶
很多人上厕所
要排队
这叫同步迅雷一次可以下载很多东西
这叫异步
Q3: java中异步处理和同步处理分别是什么意思
举个例子:A和B一起从某点出发到终点。
同步就是只能A走完某一段然后停下,让B开始走一段再停下,再让A走。如此往复。简单理解就是,必须是一段程序执行完后才能执行后面的程序。
异步就是,同一时间可能A和B同时都在往终点赶,此时不存在先后顺序,就是说,两个程序可以同时执行,称为异步。
Q4: java队列实现异步执行
在整个思路上要调整一下
1、会有很多线程给一个队列上添加任务
2、有一个或者多个线程逐个执行队列的任务
考虑一下几点:
1、没有任务时,队列执行线程处于等待状态
2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其java代码异步执行他全部wait
给个小例子吧
package org;
import java.util.LinkedList;
import java.util.List;
public class Queues {
public static ListTask queue = new LinkedListTask();
/**
* 假如 参数o 为任务
* @param o
*/
public static void add (Task t){
synchronized (Queues.queue) {
Queues.queue.add(t); //添加任务
Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来
}
}
static class Task{
public void test(){
System.out.println("java代码异步执行我被执行了");
}
}
}
package org;
import java.util.List;
public class Exec implements Runnable{
@Override
public void run() {
while(true){
synchronized (Queues.queue) {
while(Queues.queue.isEmpty()){ //
try {
Queues.queue.wait(); //队列为空时,使线程处于等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("wait...");
}
Queues.Task t= Queues.queue.remove(0); //得到第一个
t.test(); //执行该任务
System.out.println("end");
}
}
}
public static void main(String[] args) {
Exec e = new Exec();
for (int i = 0; i 2; i++) {
new Thread(e).start(); //开始执行时,队列为空,处于等待状态
}
//上面开启两个线程执行队列中的任务,那就是先到先得了
//添加一个任务测试
Queues.Task t =new Queues.Task();
Queues.add(t); //执行该方法,激活所有对应队列,那两个线程就会开始执行啦
}
}
上面的就是很简单的例子了
java代码异步执行的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java异步编程、java代码异步执行的信息别忘了在本站进行查找喔。





