📜  Servlet – 单线程模型接口

📅  最后修改于: 2022-05-13 01:54:36.463000             🧑  作者: Mango

Servlet – 单线程模型接口

单线程模型接口旨在保证在给定的 servlet 实例服务方法中一次只执行一个线程。应该实现它以确保 servlet 一次只能处理一个请求。它是一个标记接口,没有方法。一旦实现了接口,系统就会保证访问单个实例 servlet 的请求线程不会超过一个。该接口目前已被弃用,因为它并不能解决所有线程安全问题,例如静态变量和会话属性可以被多个线程同时访问,即使我们实现了SingleThreadMode l 接口。这就是为什么要解决线程安全问题,建议使用同步块

句法:

public class Myservlet  extends Httpservlet implements SingleThreadModel { 
}                                                                         

实现: SingleThreadModel 接口

我们创建了三个文件来制作这个应用程序:

  1. 索引.html
  2. 我的小服务程序。Java
  3. web.xml

index.html 文件创建一个链接来调用 URL 模式“servlet1”的 servlet,Myservlet 类扩展了 HttpServlet 并实现了 SingleThreadModel 接口。 Myservlet 类是一次处理单个请求的 servlet,sleep() 是 Thread 类中的静态方法,用于将线程的执行挂起两千毫秒。当另一个用户尝试访问同一个 servlet 时,会创建新实例,而不是为多个线程使用同一个实例。

A.文件:index.html

HTML



     HttpSession Event Listeners


     open the servlet



Java
// Java Program to Illustrate MyServlet Class
 
// Importing required classes
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Class
public class MyServlet
    extends HttpServlet implements SingleThreadModel {
 
    // Method
    // Use doGet() when you want to intercept on
    // HTTP GET requests
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException
    {
        // Sets the content type of the response being sent
        // to the client
        response.setContentType("text/html");
 
        // Returns a PrintWriter object that can send
        // character text to the client
        PrintWriter out = response.getWriter();
 
        out.print("welcome");
 
        // Try block to check for exceptions
        try {
            // Making thread to sleep for 2 seconds
            Thread.sleep(2000);
        }
 
        // Catch block to handle exceptions
        catch (Exception e) {
            // Display exception/s with line number
            e.printStackTrace();
        }
 
        out.print(" to servlet");
 
        // Closing the output stream
        // using close() method
        out.close();
    }
}


XML


 
  MyServlet
    
  MyServlet
    
 
 
    
  MyServlet
    
  /servlet1
 
   
 
    
  index.html
    
 
   


B.文件:Myservlet。Java

Java

// Java Program to Illustrate MyServlet Class
 
// Importing required classes
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Class
public class MyServlet
    extends HttpServlet implements SingleThreadModel {
 
    // Method
    // Use doGet() when you want to intercept on
    // HTTP GET requests
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException
    {
        // Sets the content type of the response being sent
        // to the client
        response.setContentType("text/html");
 
        // Returns a PrintWriter object that can send
        // character text to the client
        PrintWriter out = response.getWriter();
 
        out.print("welcome");
 
        // Try block to check for exceptions
        try {
            // Making thread to sleep for 2 seconds
            Thread.sleep(2000);
        }
 
        // Catch block to handle exceptions
        catch (Exception e) {
            // Display exception/s with line number
            e.printStackTrace();
        }
 
        out.print(" to servlet");
 
        // Closing the output stream
        // using close() method
        out.close();
    }
}

 
C.文件:web.xml  

XML



 
  MyServlet
    
  MyServlet
    
 
 
    
  MyServlet
    
  /servlet1
 
   
 
    
  index.html
    
 
   

输出:当您运行 index.html 文件时,您将看到以下结果。

要获取输出,请单击链接。

SingleThreadModel 接口的缺点

  • 当对 Web 容器有数千个并发请求时, 容器可以将请求序列化到同一个 servlet 实例,也可以创建那么多实例。
  • 在第一种情况下,容器处理并发请求的能力将由于序列化而受到严重阻碍。
  • 在后一种情况下,容器会遇到更多的对象分配(更多的对象创建开销和内存使用)。