「java异步网络编程」java异步代码

博主:adminadmin 2022-12-29 15:57:11 685

本篇文章给大家谈谈java异步网络编程,以及java异步代码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java中的异步网络编程

本文对编写客户服务器应用的java程序员有所帮助 可以解决程序在对方出现故障的时候继续稳定运行 目前java平台已经广泛应用于各类客户/服务器系统中 在实际编程中 往往需要网络的异步处理 比如客户程序 如果客户程序运行先于服务程序 则客户程序则需要在服务程序启动后再自动连接服务程序 在客户程序运行中如果服务程序中途停止 则也需要在不停止的条件下 等待服务程序运行并重新连接 下面提供了一类异步编程的方法

网络异步应用涉及到如下几个关键点

◇ 客户应用启动后 检测服务应用是否存在 如果不存在 则等待服务应用启动 同时不堵塞客户应用其他任务的执行 一旦服务应用启动 客户应用应该及时的与其建立连接 ◇ 客户应用和服务应用在数据通信中 服务应用异常退出后 客户应用应可以检测到服务应用的退出 同时客户应用自动清除该通信链路 回到初始状态 等待服务应用重新启动

该网络异步编程首先涉及到一个定时器和定时器事件 该定时器用于不断的检测网络中客户应用和服务应用是否连通 同时在服务应用出现异常时中止数据通信 返回到初始状态 网络的故障可以通过网络方法的异常处理获知

定时器包含在网络通信类中 使得使用该类的应用感知不到定时器的存在 而方便的处理网络信息

客户程序类如下结构 public class NetComm            implements ActionListener{   javax swing Timer timer = new javax swing Timer( this);       Socket sock;private EventNotifier en;public static int    net_state = ;InetAddress ServerAddr;int ServerPort;   public NetComm(InetAddress addr int port){   ServerAddr = addr;   ServerPort  = port;}

public void NetComm_Init() {           net_state = ;       try {           sock = new Socket(ServerAddr ServerPort);       } catch (IOException e) {           net_state = ;       }       timer start();}   public void NetComm_Data(){   try {       OutputStream outputstream = sock getOutputStream();              BufferedWriter out = new BufferedWriter           (new OutputStreamWriter(outputstream));                  out write( java by ghf@china );       out flush();

       BufferedReader in = new BufferedReader               (new InputStreamReader(sock getInputStream()));              boolean more = true;       while(more) {           String str = in readLine();            if(str == null) more = false;           else               // 处理数据                System out println(str);       }                  in close();

       } catch (IOException e) {       NetComm_Close();       net_state = ;       }   timer start();   }      public void NetComm_Close()   {       if(sock != null)           try{               sock close();               } catch ( IOException e) {           }   }      public void actionPerformed(ActionEvent e)   {       if(net_state == )              NetComm_Init();       else                   NetComm_Data();   }}

在以上程序中 也可以为外部应用提供一个回调函数 以便在网络异常或恢复正常时通知应用 服务应用的网络通信类类似 可以放在同一类中

lishixinzhi/Article/program/Java/hx/201311/27252

Java异步编程可以吗

不论是服务器端编程还是客户端编程,编程中的同步和异步对程序员来说都应该不陌生,我们经常会用同步编程来解决顺序执行问题、用异步解决并行执行问题。然而,就是这样的常见的编程模式,有人却将其申请为专利。在谷歌专利查询网站上专利公开号为US 20140282625 A1的专利内容就是Asynchronous programming model for concurrent workflow scenarios,在这个专利的内容摘要描述有:

异步方式在编程中的执行过程是:先将包含有跟流程信息相关的全局变量和全局上下文指针存储到一个上下文结构体中。当异步函数被执行时,全局上下文指针被存储到本地变量中,当函数执行完,全局上下文指针可以从本地变量中恢复。

下面的流程图和组件图可看出这个专利中含盖的编程模式和架构。

图1

图2

专利是一把双刃剑,它能保护专利发明人的权利、鼓励更多人来发明创造,但也会因此限制其推广和普遍使用、浪费生产力。UNIX 和 BSD 的专利之争就是最恶劣的一个案例,Java 和安卓之争也给业界带来了很多的麻烦。2004 年 4 月,微软公司申请到一个专利,内容是计算机上,在一个特定时间内按下多次按键来启动应用程序,即微软为双击鼠标启动程序申请了专利。幸好微软没有动用这项专利,否则的话后果实在太恐怖了。苹果公司也申请了很多让人哭笑不得的专利,其中最奇葩的是矩形圆角外观设计专利。

苹果此前获得的诸多关于 iPhone 和 iPad 的专利中或多或少都会包含一些实际的功能,譬如 Home 键、背部轮廓设计或者前面板整体玻璃覆盖设计等。但此次获得的专利却单单专注于外观,苹果的意图很简单:圆角矩形就是苹果发明的!专利所保护的圆角矩形设计,是一个非常宽泛的概念,宽泛到图中这个边框的横竖线条的比例都能成为它保护的对象,无论设备是 7 寸还是 20 寸。

专利可以用来维护原创者的权益,但是专利的尺度宽泛以及漏洞极有可能通过了一些不实用的专利而引起很多不必要的麻烦,甚至对行业的发展造成阻碍.

Java 异步编程框架有哪些推荐

前端框架的话EXTJS跟 JQuery 都支持异步通信,服务端的话JAVA1.7版本或更高版本的并发库有支持异步调用的API,若是远程调用,也就是系统之间调用的话,web service的任何一个框架,比如CXF都支持异步调用,因为使用的是消息传递机制进行通信,若你想用支持远程过程调用(RPC)的框架的话,那就只能面向多线程编程才能实现异步调用

java 异步调用方法

asynchronous call(异步调用)

一个可以无需等待被调用函数的返回值就让操作继续进行的方法

中文名

异步调用

外文名

asynchronous call

领域

函数

杰作

线程

快速

导航

实战用法异步调用使用方法

举例

异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了。

同步调用就是你 喊 你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去。

实战用法

操作系统发展到今天已经十分精巧,线程就是其中一个杰作。操作系统把 CPU 处理时间划分成许多短暂时间片,在时间 T1 执行一个线程的指令,到时间 T2又执行下一线程的指令,各线程轮流执行,结果好象是所有线程在并肩前进。这样,编程时可以创建多个线程,在同一期间执行,各线程可以“并行”完成不同的任务。

在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方才能继续往下执行。有了多线程的支持,可以采用异步调用,调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等对方返回结果就继续执行后续代码。被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理。

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

Java中的线程同步与异步如何理解?

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

同步就是只能A走完某一段然后停下,让B开始走一段再停下,再让A走。。如此往复。简单理解就是,必须是一段程序执行完后才能执行后面的程序。。

异步就是,同一时间可能A和B同时都在往终点赶,此时不存在先后顺序,就是说,两个程序可以同时执行,称为异步。

java异步网络编程的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java异步代码、java异步网络编程的信息别忘了在本站进行查找喔。