在Servlet 3中引入了一项新的技术可以让Servlet异步处理请求。有人可能会质疑,既然都有多线程了,还需要异步处理请求吗?答案是肯定的,因为如果一个任务处理时间相当长,那么Servlet或Filter会一直占用着请求处理线程直到任务结束,随着并发用户的增加,容器将会遭遇线程超出的风险,这种情况下很多的请求将会被堆积起来而后续的请求可能会遭遇拒绝服务,直到有资源可以处理请求为止。异步特性可以帮助应用节省容器中的线程,特别适合执行时间长而且用户需要得到结果的任务,如果用户不需要得到结果则直接将一个Runnable对象交给Executor并立即返回即可。 下面是一个支持异步处理请求的Servlet的例子:
import java.io.IOException; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = {"/async"}, asyncSupported = true) public class AsyncServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 开启Tomcat异步Servlet支持 req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); final AsyncContext ctx = req.startAsync(); // 启动异步处理的上下文 // ctx.setTimeout(30000); ctx.start(new Runnable() { @Override public void run() { // 在此处添加异步处理的代码 ctx.complete(); } }); } }1. Tomcat Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。 Tomcat Server是根据servlet和JSP规范执行的,因此,可以说Tomcat Server实行了Apache-Jakarta规范,而且,比绝大多数商业应用软件服务器要好,但是,Tomcat对静态文件、高并发的处理比较弱。 2. Jetty 1、轻量级,运行速度快。 2、易用 .默认配置可以满足大部分的需求;将 Jetty 嵌入到应用程序当中只需要非常少的代码; 3、易嵌入.Jetty 设计之初就是作为一个优秀的组件来设计的,这也就意味着 Jetty 可以非常容易的嵌入到应用程序当中。从某种程度上,你也可以把 Jetty 理解为一个嵌入式的Web服务器。 4、可扩展.Jetty 设计了非常良好的接口,用户可以非常方便地对 Jetty 的某些实现进行修改,使得 Jetty 适用于特殊的应用程序的需求。 3. JBoss 1、开源代码 ,标准的开源J2EE容器 2、性能好,执行效率高 3、支持集群,可伸缩性强。 4、支持热部署 另外,JBOSS还提供EAP版本,即企业版,支持收费服务(提供官方的支持维护,我司曾经就是JBOSS的一个大企业客户,使用效果还是很不错的)
4.BEA WebLogic (收费) 优点: 1、功能强,支持的标准多,使Web应用系统的实施更为简单。 2、支持集群,可扩展性强 3、可靠性 5.IBM WebSphere (收费) 和WebLogic类似。两者不相上下,价格也差不多。 区别是: WebLogic是BEA公司推出的,后面被Oracle收购。 WebSphere 是IBM的。两者生态圈略有不同。比如IBM还有IBM MQ,IBM BUS等,Oracle也有类似的方案。
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)) 示例代码:
import java.util.Stack; public class TestMinStack { public void push(int node) { } public void pop() { } public int top() { } public int min() { } }实现代码: 两个栈实现
public class TestMinStack { //存放最小值 Stack<Integer> minStack=new Stack<>(); //存放入栈数据 Stack<Integer> dataStack=new Stack<>(); public void push(int node) { dataStack.add(node); if(minStack.size()==0){ minStack.add(node); }else{ if(node<minStack.peek()){ minStack.pop(); minStack.add(node); } } } public void pop() { dataStack.pop(); } public int top() { return dataStack.peek(); } public int min() { return minStack.peek(); } }一个栈实现
public class TestMinStack { //存放入栈数据 Stack<Integer> stack=new Stack<>(); //存放最小值 int min=0; public void push(int node) { if(stack.isEmpty()){ stack.add(node); min=node; }else{ //每次入栈都进行一次比较,获得最小值 stack.add(node); if(node<min){ min=node; } } } public void pop() { stack.pop(); } public int top() { return stack.peek(); } public int min() { return min; } }