java 异步监听_java异步处理与监听器
计算机的内存是有限的。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异步处理与监听器相关推荐
- java jmenu 监听_Java中用得比较顺手的事件监听
第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...
- java 关闭按钮监听_Java事件处理(1)——实现简单的事件监听功能
假设我们已经建立了一个窗体,并且添加了一个按钮组件. 例:模拟登录界面 1 import javax.swing.*;2 import java.awt.*;3 4 public class Logi ...
- java属性监听_Java event事件监听属性值变化 demo
1.定义一个 ValueChangedEvent ValueChangedEvent用于在设置属性值的时候,触发事件. package org.teamlet; import java.util.Ev ...
- java 注册监听_java注册监听模型
Java的Selector调用操作系统层的Multiplexing IO(多路复用模型),本身只是个API调用.而多路复用是这个样子的: I/O multiplexing 这里面的 multiplex ...
- java回车监听_java学习:给登入界面添加键盘监听,按回车键登入
折腾了很久,终于把登入界面的键盘监听加上了,内容很简单.其实想到的话也挺简单的,毕竟可以从鼠标监听事件推测过来. 假设我们是如下的登入界面: 我们需要对文本框进行监听,而不是对整个JFrame对象进行 ...
- java jtree 监听_Java JTree.addTreeExpansionListener方法代码示例
import javax.swing.JTree; //导入方法依赖的package包/类 public PackageBrowser(JFrame frame, String title, bool ...
- java jtextfield 监听_Java JTextField DocumentListener如何用?
message.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdat ...
- CompletableFuture的多线程和异步监听实现
大家好,我是烤鸭: 今天给大家说的是多线程并发的异步监听的情况. 这里不得不说一下CompletableFuture这个类,普通我们执行多线程的时候只需要另外启动一条线程. 说一下线程的3种方式: e ...
- java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?
随着时代的不断进步与发展,人们对于科学技术的使用也越来越普遍化.人们都开始自己学习编程语言以更好的适应时代的发展.今天就来为大家介绍一下,java中监听一个客户端怎么做?监听多个怎么做?一起来看看吧. ...
最新文章
- C#中字节数组与字符串的来回转换
- Alibre Design 2018中文版
- Linux之xargs
- HDU 2897 邂逅明下(简单博弈)
- 【Java】函数式编程
- TCP连接(Time_Wait、Close_Wait)说明
- android七牛云存储,Android上传图片到七牛云
- Aizu ITP2_6_A 二分
- winform mysql 客户端_Winform+Mysql登录
- 《Adobe Photoshop CS4中文版经典教程》—第1课1.7节检查更新
- “2016年度优秀软件工程造价师”“工信部行业标准《软件研发成本度量规范》2016年度应用示范单位” 评选活动正式启动...
- 一个基于ATMEGA128的直流电机抱死程序
- 2021年T电梯修理免费试题及T电梯修理考试试卷
- FBReader接入
- 计算机科学刘培姣,高中物理课堂融入物理学史体现核心素养的必要性
- notify()和notifyAll()有什么区别?
- 快速上手Luminati的三个使用方法
- 第14章可迭代的对象,迭代器和生成器
- C语言I博客作业04
- 百度API海王撩妹话术生成器模板
热门文章
- 设字符型变量 x 的值是 064,表达式....的值是
- python dict遍历_python遍历字典dict的几种方法汇总
- 文本检索系统-7:软件和数据
- thinking in asp 之二 高端大气上档次
- ubuntu 安装 JDK
- Vue的Computed中的setter的使用
- 基于LSTM的情感识别在鹅漫评论分析中的实践与应用
- .net中国(www.hiaspx.com),现面向所有.net程序员招聘版主
- 2021年安全生产监管人员模拟考试及安全生产监管人员模拟考试题库
- 梁宁《产品思维》之10抓住做产品的“点”(痛点、爽点和痒点)