Как проверить многопоточный характер сервлетов? - PullRequest
0 голосов
/ 04 июня 2019

Я создал простое приложение сервлетов со следующим кодом:
Используя java 1.8
Apache Tomcat 9.0.14
Servlet api 4.0

package com.cg.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MultiThreadedServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("request received");
    try{
        Thread.sleep(5000);
    }catch(Exception ex) {
        ex.printStackTrace();
    }
    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
    pw.println("<html><body>");
    pw.println("<h1>MultiThreadedServlet</h1>");
    pw.println("</body></html>");
    pw.close();
    System.out.println("request processed");

}
}

package com.cg.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SingleThreadedServlet extends HttpServlet{

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    synchronized (this) {
        System.out.println("request received");
        try {
            Thread.sleep(5000);
        }catch(Exception ex) {
            ex.printStackTrace();
        }
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        pw.println("<html><body>");
        pw.println("<h1>SingleThreadedServlet</h1>");
        pw.println("</body></html>");
        pw.close();
        System.out.println("request processed");
    }
}
}

Я открыл 3 вкладки в браузереи попытался получить доступ к MultiThreadedServlet со всех 3 вкладок одновременно

Я ожидал увидеть следующее сообщение на консоли:
запрос получен
запрос получен
запрос получен
запрос обработан
запрос обработан
запрос обработан

Фактические результаты:
запрос получен
запрос обработан
запрос получен
запрос обработан
запрос получен
запрос обработан

Я открыл 3 вкладки в браузере и попытался получить доступ к SingleThreadedServlet со всех 3 вкладок одновременно

Я ожидал увидеть следующее сообщение на консоли:
запрос получен
запрос обработан
запрос получен
запрособработано
запрос получен
запрос обработан

Фактические результаты:
запрос рекeived
запрос обработан
запрос получен
запрос обработан
запрос получен
запрос обработан

SingleThreadedServlet работает должным образом.В случае MultiThreadedServlet, почему фактические результаты не совпадают с ожидаемыми результатами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...