【发布时间】:2019-02-28 20:10:34
【问题描述】:
我编写了一个 servlet 程序,它调用一个 java 类来生成随机字符串。我还编写了一个 HTML 文件,其中有 1000 个 IFRAME 指向 servlet 地址。如果多个请求将发送到一个 servlet,则每个请求将在单独的线程中处理。所以在这种情况下,正在创建 1000 个线程(1000 个请求)。问题在于,如果请求超过 1000 个,则需要花费大量时间来处理并且无法处理,依此类推。如果我在后端进行复杂的计算,它会变得更慢。为了快速响应,需要在 servlet 级别(多线程)或 tomcat 级别(如果可能)进行哪些更改。有什么建议吗?
Servlet 代码
@WebServlet("/test")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static PrintWriter out=null;
private UserOperation operation=null;
private static int counter=0;
public MyServlet() {
super();
operation=new UserOperation();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
counter++;
out=response.getWriter();
String output=operation.getResult();
System.out.println(counter+":"+output);
out.print(output);
return;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
UserOperation.java
import java.util.Random;
public class UserOperation {
private Random rand=null;
private int max=9;
private int min=0;
private static final String [] RESULT= {"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN"};
public UserOperation() {
rand=new Random();
}
public String getResult() {
int randNum=rand.nextInt((max-min)+1)+min;
return RESULT[randNum];
}
}
HTML 文件
1000 次 IFRAME 调用。下面的行在 HTML 文件中被复制粘贴了 1000 次。
<IFRAME src="http://localhost:8080/MultipleRequest/test" width="30px" height="30px"></IFRAME>
【问题讨论】:
-
@NathanHughes Using System.out.println 是为了测试它将返回什么。情况并非如此。问题是servlet如何同时处理更多的请求。如果您查看我的代码,我只是在每个请求和性能方面返回一个随机字符串,它非常慢。
-
没有创建 1000 个线程...Tomcat 默认有 200 个请求处理线程,其他所有线程都将排队等待线程完成处理。另外,您的测试有多现实……除此之外,您的浏览器甚至可能阻止并发请求,并且当时只有 6 个或什至 1 个到达。此外,您的 servlet 甚至不是线程安全的,而且实际上很危险...删除对
PrintWriter的静态引用并将其设置为您的方法的本地。
标签: java multithreading jakarta-ee tomcat8