计算机的内存是有限的。tomcat 7 中,最多的线程为200,。为了最大化,需要异步,这样可以节省线程。具体什么是异步,为什么要用异步,我不想多写了,会好累的,我怕写着写着就不想继续下去了。

异步有两种方式---Servlet和Filter。要实现异步,必须地显式声明asyncSupported=true;而这里,也有两种方法可以声明。第一种是注解。具体如下:

@WebServlet(name="AsyncDispatchServlet", urlPatterns={"/asyncDispatch"}, asyncSupported=true)

就这么一行代码,在类声明的前面。 如果这一种不是十分喜欢的话,不放考虑较为传统的方式----在部署文件web.xml设置。具体如下:

AsyncComplete

servlet.AsyncCompleteServlet

true ///这里

AsyncComplete

/asyncComplete

下面具体讲解一下怎么使用

支持异步处理的Servlet或者Filter可以通过在ServletRequest中调用startAsync方法来启动新的线程。startAsync有两个重载方法,常用的是不带参数的。调用之后会返回AsyncContext实例。话就不想多说了,还是直接上代码吧。

@WebServlet(name="AsyncDispatchServlet", urlPatterns={"/asyncDispatch"}, asyncSupported=true)

public class AsyncDispatchServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override

protected void doGet(final HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// TODO Auto-generated method stub

final AsyncContext asyncContext = req.startAsync();

req.setAttribute("mainThread", Thread.currentThread().getName());

asyncContext.setTimeout(5000);

asyncContext.start(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(3000);

} catch(InterruptedException e) {

e.printStackTrace();

}

req.setAttribute("workerThread", Thread.currentThread().getName());

//asyncContext.dispatch("/threadNames.jsp");

asyncContext.complete();

}

});

}

}

就用代码帮自己理清头绪。

final AsyncContext asyncContext = req.startAsync();      //返回AsyncContext 实例。

asyncContext.setTimeout(5000);    //设置最多等待时间,超过时间的话会报错的。

asyncContext.start(new Runnable() {    };      //开启一个线程,里面干嘛,自己决定。

当任务完成的时候,Runnale里面调用asyncContext.complete方法或者dispatch方法。后者可以传入一个页面。

小结一下编写异步的Servlet的步骤:

1. ServletRequest中调用startAsync方法,返回AsyncContext实例。

2.在AsyncContext中调用setTimeout方法,设置等待任务的时间。

3. 调用asyncContext.start方法,传递一个长时间执行的runnable。

4.任务完成的时候,通过runnable调用asyncContext.complete方法或者.dispatch方法

好吧,大功告成了!

--------------------------------------------------------------------------分割线--------------------------------------------------------------------

异步监听器,上一篇文章所说的,就是这节的重点。

jjavax.servlet.AsyncListener.。里面有四个函数。分别是onStartAsync, onComplete, onError, onTimeout,四个方法必须地实现。各有一个参数AsyncEvent,可以getAsyncContext获得实例。意思很明显,相应的时间出发相应的函数。在使用的时候,直接AsyncContext.addListener( //javax.servlet.AsyncListener的实例),其他的就没有什么两样了。关键代码如下

final AsyncContext asyncContext = request.startAsync();

asyncContext.setTimeout(5000);

asyncContext.addListener(new MyAsyncListener());

asyncContext.start(new Runnable() {

就是这样简单。还是那句,相应的事件,执行相应的函数。

---------------------------------------------------------------------所长,别开枪,是我,分割线----------------------------------------------------------------

写完了,每次写东西都是挺累的,但是写完又会感觉好开心。这篇文章的内容很空洞,只是讲了基本的框架和用法。以后再在实际项目开发的时候就可以基于此基础框架上使用了。

好吧,祝愿自己有个好睡眠,准备晚安了。

java 异步监听_java异步处理与监听器相关推荐

  1. java jmenu 监听_Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  2. java 关闭按钮监听_Java事件处理(1)——实现简单的事件监听功能

    假设我们已经建立了一个窗体,并且添加了一个按钮组件. 例:模拟登录界面 1 import javax.swing.*;2 import java.awt.*;3 4 public class Logi ...

  3. java属性监听_Java event事件监听属性值变化 demo

    1.定义一个 ValueChangedEvent ValueChangedEvent用于在设置属性值的时候,触发事件. package org.teamlet; import java.util.Ev ...

  4. java 注册监听_java注册监听模型

    Java的Selector调用操作系统层的Multiplexing IO(多路复用模型),本身只是个API调用.而多路复用是这个样子的: I/O multiplexing 这里面的 multiplex ...

  5. java回车监听_java学习:给登入界面添加键盘监听,按回车键登入

    折腾了很久,终于把登入界面的键盘监听加上了,内容很简单.其实想到的话也挺简单的,毕竟可以从鼠标监听事件推测过来. 假设我们是如下的登入界面: 我们需要对文本框进行监听,而不是对整个JFrame对象进行 ...

  6. java jtree 监听_Java JTree.addTreeExpansionListener方法代码示例

    import javax.swing.JTree; //导入方法依赖的package包/类 public PackageBrowser(JFrame frame, String title, bool ...

  7. java jtextfield 监听_Java JTextField DocumentListener如何用?

    message.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdat ...

  8. CompletableFuture的多线程和异步监听实现

    大家好,我是烤鸭: 今天给大家说的是多线程并发的异步监听的情况. 这里不得不说一下CompletableFuture这个类,普通我们执行多线程的时候只需要另外启动一条线程. 说一下线程的3种方式: e ...

  9. java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?

    随着时代的不断进步与发展,人们对于科学技术的使用也越来越普遍化.人们都开始自己学习编程语言以更好的适应时代的发展.今天就来为大家介绍一下,java中监听一个客户端怎么做?监听多个怎么做?一起来看看吧. ...

最新文章

  1. C#中字节数组与字符串的来回转换
  2. Alibre Design 2018中文版
  3. Linux之xargs
  4. HDU 2897 邂逅明下(简单博弈)
  5. 【Java】函数式编程
  6. TCP连接(Time_Wait、Close_Wait)说明
  7. android七牛云存储,Android上传图片到七牛云
  8. Aizu ITP2_6_A 二分
  9. winform mysql 客户端_Winform+Mysql登录
  10. 《Adobe Photoshop CS4中文版经典教程》—第1课1.7节检查更新
  11. “2016年度优秀软件工程造价师”“工信部行业标准《软件研发成本度量规范》2016年度应用示范单位” 评选活动正式启动...
  12. 一个基于ATMEGA128的直流电机抱死程序
  13. 2021年T电梯修理免费试题及T电梯修理考试试卷
  14. FBReader接入
  15. 计算机科学刘培姣,高中物理课堂融入物理学史体现核心素养的必要性
  16. notify()和notifyAll()有什么区别?
  17. 快速上手Luminati的三个使用方法
  18. 第14章可迭代的对象,迭代器和生成器
  19. C语言I博客作业04
  20. 百度API海王撩妹话术生成器模板

热门文章

  1. 设字符型变量 x 的值是 064,表达式....的值是
  2. python dict遍历_python遍历字典dict的几种方法汇总
  3. 文本检索系统-7:软件和数据
  4. thinking in asp 之二 高端大气上档次
  5. ubuntu 安装 JDK
  6. Vue的Computed中的setter的使用
  7. 基于LSTM的情感识别在鹅漫评论分析中的实践与应用
  8. .net中国(www.hiaspx.com),现面向所有.net程序员招聘版主
  9. 2021年安全生产监管人员模拟考试及安全生产监管人员模拟考试题库
  10. 梁宁《产品思维》之10抓住做产品的“点”(痛点、爽点和痒点)