一.分析教材P132的程序清单:
//规定了Filter负责拦截所有的用户请求的过滤范围。
long before = System.currentTimeMillis(); .......... long after = System.currentTimeMillis();
//将请求强制转换为HttpServletRequest型再赋给HttpServletRequest 请求对象hrequest
HttpServletRequest hrequest = (HttpServletRequest) request ;
//通过getServletPath()函数打印Filter 已经拦截到用户的请求的地址
System.out.println("Filter 已经拦截到用户的请求的地址: " + hrequest.getServletPath());
二.总结JEETT文档中两段代码的差别,并分析启动代码后的效果有什么不同?
1.首先介绍一下什么是异步处理、异步任务
异步处理:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是其功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。
AsyncTask: 即asynchronous task,异步任务。AsyncTask实际上是围绕Thread和Handler设计的一个辅助类,在内部是对Thread和Handler的一种封装。AsyncTask的异步体现在由后台线程进行运算(访问网络等比较耗时的操作),然后将结果发布到用户界面上来更新UI,使用AsyncTask使得我不用操作Thread和Handler。
2.异步与同步的区别是什么?
同步与异步的区别:在于请求的内容是不是立刻返回,同步请求需要等待结果返回后才能继续执行。单线程的执行的时候,需要顺序执行,如果碰到一个计算量很大,很耗时的函数需要执行,该线程就必须在这里等待结果计算出来以后,才能继续执行。
异步请求理论上不需要等待请求的结果,将耗时的计算交给另外一个线程,在结果计算完成后会通知主线程。实际上,异步请求会立刻得到一个临时结果,然后异步请求就可以继续执行了,当异步线程返回真正结果后再通知主线程,然后主线程在做出动作。
3.根据上面的基础知识,可大致得出文档中代码的区别为:
(1)request.startAsync()
导致请求被异步处理; 在服务方法结束时,响应不会发送到客户端。
(2)acontext.start(new Runnable() {…})
从容器中获取新线程。
(3)run()
内部类的方法的代码在新线程中执行。内部类可以访问异步上下文以从请求读取参数并写入响应。调用complete()
异步上下文的 方法将提交响应并将其发送给客户端。
运行效果不同之处:使用异步处理后的例子在大负载的情况下响应速度变快,服务器吞吐量变大
参考:http://www.cnblogs.com/real-psyyyy1015/p/8641580.html