Servlet3中的AsyncContext异步和多线程异步有什么区别

问题描述

我如果想异步向页面输出,则可以使用Servlet3中的AsyncContext。也可以在Servlet中另外启动一个多线程处理,让主线程先返回页面两种方式的代码如下public class ListServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("I am begin output !"); response.getWriter().flush(); //方式一 AsyncContext async = request.startAsync(); new AsyncOutput(async).start(); //方式二 new ThreadOutput(response).start(); response.getWriter().println("I am finash output !"); response.getWriter().flush(); } } class AsyncOutput extends Thread{ private AsyncContext async; public AsyncOutput(AsyncContext async) { this.async = async; } public void run() { try { Thread.sleep(3000); async.getResponse().getWriter().println("I was three minutes late !"); async.getResponse().getWriter().flush(); }catch(Exception e) { e.printStackTrace(); } }} class ThreadOutput extends Thread{ private HttpServletResponse response; public ThreadOutput(HttpServletResponse response) { this.response = response; } public void run() { try { Thread.sleep(3000); response.getWriter().println("I was three minutes late !"); response.getWriter().flush(); }catch(Exception e) { e.printStackTrace(); } }}这两种效果是一样啊既然如此,那还搞什么AsyncContextAsyncContext有什么不一样的地方以上两种使用方式,有什么区别?求指点

解决方案

AsyncContext不是让你异步输出,而是让你同步输出,但是解放服务器端的线程使用,使用AsyncContext的时候,对于浏览器来说,他们是同步在等待输出的,但是对于服务器端来说,处理此请求的线程并没有卡在那里等待,则是把当前的处理转为线程池处理了,关键就在于线程池,服务器端会起一个线程池去服务那些需要异步处理的请求,而如果你自己每次请求去起一个线程处理的话,这就有可能会耗大量的线程。你目前对AsyncContext 的使用并不是最佳实践,实际上应该这样使用:final AsyncContext asyncContext = request.getAsyncContext(); asyncContext.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent event) throws IOException { //在这里处理正常结束的逻辑 } @Override public void onTimeout(AsyncEvent event) throws IOException { //在这里处理超时的逻辑 } @Override public void onError(AsyncEvent event) throws IOException { //在这里处理出错的逻辑 } @Override public void onStartAsync(AsyncEvent event) throws IOException { //在这里处理开始异步线程的逻辑 } }); //设置超时的时间,到了时间以后,会回调onTimeout的方法 asyncContext.setTimeout(10000L); //在这里启动,传入一个Runnable对象,服务器会把此Runnable对象放在线程池里面执行 asyncContext.start(new Runnable() { @Override public void run() { //在这里做耗时的操作,如果做完,则调用complete方法通知回调,异步处理结束了 asyncContext.complete(); } });
解决方案二:
我们可以在容器内部配置一些异步超时时间关于AsyncContext的配置,以超时为例,当异步线程中的数据在向response中写的时候,如果已经超时,此时的数据就写不回去了。而通过线程持有response的方式,其实就相当于组合使用了response一样,异步Context的一切其它配置,都不会影响之。我想这应该是两者的区别吧。
解决方案三:
上面的排版太难看了,看这个:final AsyncContext asyncContext = request.getAsyncContext();//添加监听器监听异步的执行结果asyncContext.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent event) throws IOException { //在这里处理正常结束的逻辑 } @Override public void onTimeout(AsyncEvent event) throws IOException { //在这里处理超时的逻辑 } @Override public void onError(AsyncEvent event) throws IOException { //在这里处理出错的逻辑 } @Override public void onStartAsync(AsyncEvent event) throws IOException { //在这里处理开始异步线程的逻辑 }});//设置超时的时间,到了时间以后,会回调onTimeout的方法asyncContext.setTimeout(10000L);//在这里启动,传入一个Runnable对象,服务器会把此Runnable对象放在线程池里面执行asyncContext.start(new Runnable() { @Override public void run() { //在这里做耗时的操作,如果做完,则调用complete方法通知回调,异步处理结束了 asyncContext.complete(); }});

时间: 2024-09-07 15:06:56

Servlet3中的AsyncContext异步和多线程异步有什么区别的相关文章

javascript 多线程异步队列

首先,你得知道 jQuery.Deferred 的大致用法,然后,我们进入正题吧: 库代码: /*!  * 多线程异步队列  * 依赖 jQuery 1.8+ (如果你用的是 1.6或1.7, 只要将源码中的 then方法替换为pipe方法 即可)  */ /**  * @n {Number} 正整数, 线程数量  */ function Queue (n) {     n = parseInt(n 1, 10);     return new Queue.prototype.init( (n

实现PHP多线程异步请求的3种方法

 实现PHP多线程异步请求的方法有很多,在本文整理了3种不多的常用方法,大家可以参考下 在网上看过很多版本的PHP异步请求方法,这里简单总结几个常用方法分享给大家    1.用CURL实现一步请求    CURL扩展是我们在开发过程中最常用的一种方法,他是一个强大的HTTP命令行工具,可以模拟POST/GET等HTTP请求,然后得到和提取数据,显示在"标准输出"(stdout)上面.    示例:   代码如下: <?php  $cl = curl_init();  $curl_

【Python之旅】第六篇(五):生产者消费者模型实现多线程异步交互

 虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 1.生产者消费者模型:厨师做包子与顾客吃包子 2.Python的消息队列 3.利用消息队列实现Python多线程异步交互 4.再谈耦合度的问题 1.生产者消费者模型     通过厨师做包子与顾客吃包子来引出生产者消费者模型,如下图:     这里,厨师相当于生产者,顾客相当于消费者,顾客吃包子,

修改ui-C# click事件 多线程 异步 耗时 操作UI

问题描述 C# click事件 多线程 异步 耗时 操作UI listbox做了个目录(单层),点击一条就在另一个控件加载相应的内容.这个加载过程是耗时操作.所以考虑用异步,在click处理函数里开了子线程.因为需要操作UI,所以在子线程里调用invoke,但是无论使用invoke还是beginInvoke,那个加载内容的函数都是在UI线程上执行.这样就会造成UI线程阻塞.想实现的效果是,一次点击之后马上能响应下一次点击同时把上一次点击的加载线程结束掉而执行当前点击的加载线程.或者在下一次点击的

同步,异步,多线程,你怎么看?

原文:同步,异步,多线程,你怎么看?[原创] 讲解同步与异步的帖子多如牛毛,个人的理解,简单地说同步就是串行,异步就是并行.同步的情况下,A调用B,A等B执行完成后接着执行,自始至终只有一个线程在运行:而异步时,A调用B,B执行,A也继续执行,这个过程中有两个线程在运行.本文通过winform下的一个实例讲解同步与异步的差别,本文的例子很简单,适合初学者. 1.同步 大家应该经常碰到这种情况,点击界面上某个按钮或者某个控件后界面卡死的情况,个人觉得其中一个原因可能是主线程的问题,界面主线程在后台

C#——await与async实现多线程异步编程

           以前,我们或许用过Thread,在主线程执行的时候,新开另一个新线程,来执行新方法.            今天看别人发给我的一段代码的时候发现了一个不认识的await,但是又感觉很熟悉的样子,感觉是线程那块儿的东西,查了下,发现一个简单的方法实现多线程异步编程.(PS:framework 在4.5以上才可以哦~)        /// <summary> /// 测试方法 /// </summary> /// <remarks>创建者:刘慧超;

个人对于异步和多线程的关系的理解分享_IOS

个人的理解是这样的: 1.  异步通信的意思是,当A发送完消息之后,不等待B的回应,继续执行之后的程序.在将来的某个时刻,A再来检查是否收到B的回应.      异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作. 2. 多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码.多线程可以实现线程间的切换执行. 3. 异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待.协调运行.线程就是实现异步的一个方式.异步是让调用方法的主线程不需要同步

php异步:在php中使用fsockopen curl实现类似异步处理的功能方法_php技巧

PHP从主流来看,是一门面向过程的语言,它的最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,这一点是限制php在主流程序语言中往更高级的语言发展的原因之一. 在PHP中我们有的时候其实希望在执行某项操作的时候,同时去执行另外一项操作,举一个场景:在用户抢票的时候,你并不希望用户排队去连接数据库进行查询.判断.插入,完成之后再返回用户结果.其实我们并不需要用户等那么久的时间,用户提交之后,直接告诉他已经抢票成功了就可以了,至于各种操作,交给后台去处理

多线程异步调用 java-多线程异步调用的问题

问题描述 多线程异步调用的问题 请改造以下类,使之在多线程异步调用时,而不会出数据覆盖,即并发冲突 pulbi class Math { private static int result = 0; public static int sum(int a, int b){ result = a + b; return result; } } 请教大神 怎么做 解决方案 如果不考虑同步控制粒度问题,直接把synchronized(Math.class) 加在当前类定义上的,是可行的 当然控制同步的