使用回调和线程处理一个耗时响应过程
来源:互联网 发布:创博龙智 网络推广 编辑:程序博客网 时间:2024/05/29 15:07
from:http://www.blogjava.net/sitinspring/archive/2007/06/28/126809.html
现在程序中有许多涉及长耗时响应过程的处理,比如访问WebService,远程调用,复杂处理等,如果我们使用直接顺序执行的方式进行处理有可能导致界面停顿,响应停止,无谓等待等缺陷,这是不应该的。
一个耗时响应过程应该采用回调和线程来处理,具体就是把原来的顺序执行修改为异步方式,并让被调用者调用调用者以获得执行结果。在附件的例子中,Viewer就是调用者,它代表界面,而LongTimeResponse是被调用者,它内部用线程启动一个耗时过程,执行完毕再通知调用者。
Viewer类代码如下:
public class Viewer{
private int count;
public Viewer(int count){
this.count=count;
}
public void printNewCount(int newCount){
System.out.println("New Count="+newCount);
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
private int count;
public Viewer(int count){
this.count=count;
}
public void printNewCount(int newCount){
System.out.println("New Count="+newCount);
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
LongTimeResponse类代码如下,可以看出,它之所以能回调调用者,是因为其内部有调用者的引用viewer,在其构造函数中viewer被赋上了值:
package com.sitinspring;
public class LongTimeResponse implements Runnable{
private Viewer viewer;
private int count;
public LongTimeResponse(Viewer viewer){
this.viewer=viewer;
this.count=viewer.getCount();
caculateNewCount();
}
private void caculateNewCount(){
Thread thread=new Thread(this);
thread.start();
}
public void run(){
try{
Thread.sleep(10000);
}
catch(Exception ex){
ex.printStackTrace();
}
viewer.printNewCount(count*count*count);
}
}
public class LongTimeResponse implements Runnable{
private Viewer viewer;
private int count;
public LongTimeResponse(Viewer viewer){
this.viewer=viewer;
this.count=viewer.getCount();
caculateNewCount();
}
private void caculateNewCount(){
Thread thread=new Thread(this);
thread.start();
}
public void run(){
try{
Thread.sleep(10000);
}
catch(Exception ex){
ex.printStackTrace();
}
viewer.printNewCount(count*count*count);
}
}
调用过程如下:
Viewer viewer=new Viewer(10);
LongTimeResponse longTimeResponse=new LongTimeResponse(viewer);
viewer.printNewCount(123);
LongTimeResponse longTimeResponse=new LongTimeResponse(viewer);
viewer.printNewCount(123);
执行起来可以看出,程序先输出了
New Count=123
过了十秒,才输出:
New Count=1000
这说明,程序是异步执行的,耗时过程没有影响到主干程序的运行,而耗时过程完成后,才把返回结果通知了调用者,主干程序没有受到耗时过程的影响,因此也就不会导致界面停顿,响应停止,无谓等待等缺陷。
以上就是使用回调和线程处理一个耗时响应的整个过程。
这里可下载整个程序:
http://www.blogjava.net/Files/sitinspring/Callback20070628133516.zip
- 使用回调和线程处理一个耗时响应过程
- AsyncTask 使用后台线程处理耗时操作
- 自己封装的一个支持回调和独立线程的异步发送邮件的类
- 使用多线程处理耗时工作
- SWT 启用另一个线程处理耗时事务
- wxPython画面使用delayedresult进行耗时处理
- 【Android】使用AsyncTask处理耗时任务
- 如何用Java回调和线程实现异步调用
- Broadcast Receiver开启服务而不是子线程处理耗时操作
- android开发 用线程进行耗时操作,统一处理
- Broadcast Receiver开启服务而不是子线程处理耗时操作
- 函数使用:调和平均数
- 使用线程同时处理一个DataTable
- 线程处理过程分析
- Entity回调和监听器
- 回调和监听
- 明白回调和委托
- 【Android】Handler使用入门 处理耗时较长的程序
- 今天猫扑空间的访问统计数据
- 一列拆分为多列
- java非对称加密的源代码(RSA)
- 找出数据库表里重复记录和重复记录数的SQL
- 1-jsf+ejb3.0
- 使用回调和线程处理一个耗时响应过程
- 排序
- JVM内存限制
- 排序算法空间、时间复杂度
- 各种内部排序算法复杂度的比较和排序方法的选择
- 给新人程序员的八点建议
- 二叉树的五个性质
- JDK内置工具使用技巧
- 模式匹配与KMP算法