Java 即使在提交响应后,线程仍处于活动状态

Java 即使在提交响应后,线程仍处于活动状态,java,multithreading,servlets,Java,Multithreading,Servlets,我有一个Servlet来显示一个登录页面,当我输入URL时,Servlet由一个单独的线程指定并执行工作。但是即使在提交响应(即,在完成任务后)线程仍然是活动的,为什么它会这样做?当im在页面中得到响应后,活动状态显示为True 代码: 公共类LoginNew扩展HttpServlet实现可运行{ 受保护的无效服务(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{ PrintWriter Writ

我有一个Servlet来显示一个登录页面,当我输入URL时,Servlet由一个单独的线程指定并执行工作。但是即使在提交响应(即,在完成任务后)线程仍然是活动的,为什么它会这样做?当im在页面中得到响应后,活动状态显示为True

代码:

公共类LoginNew扩展HttpServlet实现可运行{
受保护的无效服务(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
PrintWriter Writer=response.getWriter();
writer.println(
"" + 
"" + 
"" + 
“用户名:
”+ “密码:
”+ “超时时间间隔:
”+ “无超时:未超时

”+ "" + " "+ "" + "" + "" + "" ); Thread.currentThread().sleep(60000); System.out.println(“提交后线程->”+线程.currentThread().getName()+“活动状态-->”+线程.currentThread().isAlive()); } }
根据您的代码, 看起来您正在检查线程内部线程的活动性,当然它在那一刻是活动的。为了更加清晰,您可以使用VisualVM程序,它显示了程序中生成的每个线程以及其他有关线程的有用信息

根据您的代码,
看起来您正在检查线程内部线程的活动性,当然它在那一刻是活动的。为了更加清晰,您可以使用VisualVM程序,它显示了程序中生成的每个线程以及其他有关线程的有用信息

这里有很多误解和奇怪之处:

  • 如果可以调用
    Thread.currentThread().isAlive()
    ,它将始终返回
    true
    。如果当前线程不是活动线程,则它无法执行任何操作

  • 典型的servlet容器不会终止请求线程。这将是低效的。相反,当一个请求完成时,请求线程将返回到池中,以便它可用于下一个请求

  • “即使在提交响应之后;即在完成工作之后……”。这不是“提交响应”的意思。它实际上意味着HTTP响应头已经被写入。这意味着不再可能更改响应代码或更新任何响应头。(在您的示例中,响应是在调用
    getWriter
    时提交的)

  • 事实上,在关闭
    PrintWriter
    之前,响应实际上无法完成。这可能是
    服务
    方法中的显式关闭,也可能是
    服务
    调用返回后发生的隐式关闭

  • 在您的示例中,您在编写响应主体和返回之间睡眠了60秒。由于写入后未刷新
    编写器
    ,这可能意味着客户端(例如浏览器)必须等待60秒才能到达完整的正文

  • sleep
    还将锁定其中一个请求线程60秒。如果有太多的请求同时执行此操作,则可能会占用所有线程。这是个坏主意


  • 这里有许多误解和奇怪之处:

  • 如果可以调用
    Thread.currentThread().isAlive()
    ,它将始终返回
    true
    。如果当前线程不是活动线程,则它无法执行任何操作

  • 典型的servlet容器不会终止请求线程。这将是低效的。相反,当一个请求完成时,请求线程将返回到池中,以便它可用于下一个请求

  • “即使在提交响应之后;即在完成工作之后……”。这不是“提交响应”的意思。它实际上意味着HTTP响应头已经被写入。这意味着不再可能更改响应代码或更新任何响应头。(在您的示例中,响应是在调用
    getWriter
    时提交的)

  • 事实上,在关闭
    PrintWriter
    之前,响应实际上无法完成。这可能是
    服务
    方法中的显式关闭,也可能是
    服务
    调用返回后发生的隐式关闭

  • 在您的示例中,您在编写响应主体和返回之间睡眠了60秒。由于写入后未刷新
    编写器
    ,这可能意味着客户端(例如浏览器)必须等待60秒才能到达完整的正文

  • sleep
    还将锁定其中一个请求线程60秒。如果有太多的请求同时执行此操作,则可能会占用所有线程。这是个坏主意


  • 最好附加一些出现此问题的代码。这使帮助您变得非常容易。当然@JakobF我已经附加了。我想这回答了您的XY问题的X:是的,我有一些想法,谢谢@BalusCIt,附加一些出现此问题的代码是个好主意。这使帮助你变得更加容易。当然@JakobF我已经附上了。我想这回答了你XY问题的X:是的,我有一些想法,谢谢@BalusC