Servlet – 单线程模型接口
单线程模型接口旨在保证在给定的 servlet 实例服务方法中一次只执行一个线程。应该实现它以确保 servlet 一次只能处理一个请求。它是一个标记接口,没有方法。一旦实现了接口,系统就会保证访问单个实例 servlet 的请求线程不会超过一个。该接口目前已被弃用,因为它并不能解决所有线程安全问题,例如静态变量和会话属性可以被多个线程同时访问,即使我们实现了SingleThreadMode l 接口。这就是为什么要解决线程安全问题,建议使用同步块。
句法:
public class Myservlet extends Httpservlet implements SingleThreadModel {
}
实现: SingleThreadModel 接口
我们创建了三个文件来制作这个应用程序:
- 索引.html
- 我的小服务程序。Java
- 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 实例,也可以创建那么多实例。
- 在第一种情况下,容器处理并发请求的能力将由于序列化而受到严重阻碍。
- 在后一种情况下,容器会遇到更多的对象分配(更多的对象创建开销和内存使用)。