Java 如何避免线程中的无头异常?

Java 如何避免线程中的无头异常?,java,swing,servlets,multithreading,awt,Java,Swing,Servlets,Multithreading,Awt,我曾尝试在Servlet中打开一个对话框&它可以很好地打开。 但后来我尝试在线程的run方法中实现同样的效果。 它给了我以下错误: java.awt.HeadlessException at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159) at java.awt.Window.<init>(Window.java:431) at java.awt.Frame.<init>(F

我曾尝试在Servlet中打开一个对话框&它可以很好地打开。 但后来我尝试在线程的run方法中实现同样的效果。 它给了我以下错误:

java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:431)
at java.awt.Frame.<init>(Frame.java:403)
我也尝试了下面的代码,但失败了

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless());
if(!ge.isHeadless()){ 
    System.setProperty("java.awt.headless", "true");
}
例外情况描述为:
在不支持键盘、显示器或鼠标的环境中调用依赖于键盘、显示器或鼠标的代码时引发

有一些代码最终需要触摸图形卡,或者至少是Java中的工作图形子系统。如果在未启用图形的系统上运行此代码,则将抛出HeadlessException

您正在一个Servlet中运行代码,该Servlet是一个通常返回网页的代码块。由于网页是一个包含所有正确标记的大字符串,因此网页不需要图形环境。该字符串由web浏览器接收,web浏览器通常有一个图形环境来显示结果

在web服务器上,您要求web页面生成器和servlet打开一个对话框。这会产生问题,原因有很多:

该对话框将显示在web服务器上,而不是web客户端上。 web服务器只有一个屏幕,对话框将根据浏览网页的用户弹出。 由于服务器可能同时处理多个客户机,因此服务器被调整为为为每个客户机使用最小数量的资源。 由于服务器只向web浏览器返回项目,因此服务器不需要图形环境。 所有这些点的结合意味着servlet将不会被配置为访问图形环境,也没有机会显示弹出对话框;因为,没有可用于显示对话框的图形环境


一般来说,不能将swing/awt代码与servlet混合使用;但是,swing和awt中都有一部分图形操作可用,它们允许在不需要图形环境的情况下进行图像处理。这是为了简化在文件处理环境中转换和构建图像的开发,在该环境中,程序永远不会显示图像。以.png到.jpg转换器为例,如果它从不显示图像,程序可以打开图像来完成工作,然后关闭图像而不需要图形卡。

有一些代码最终需要触摸图形卡,或者至少是Java中的工作图形子系统。如果在未启用图形的系统上运行此代码,则将抛出HeadlessException

您正在一个Servlet中运行代码,该Servlet是一个通常返回网页的代码块。由于网页是一个包含所有正确标记的大字符串,因此网页不需要图形环境。该字符串由web浏览器接收,web浏览器通常有一个图形环境来显示结果

在web服务器上,您要求web页面生成器和servlet打开一个对话框。这会产生问题,原因有很多:

该对话框将显示在web服务器上,而不是web客户端上。 web服务器只有一个屏幕,对话框将根据浏览网页的用户弹出。 由于服务器可能同时处理多个客户机,因此服务器被调整为为为每个客户机使用最小数量的资源。 由于服务器只向web浏览器返回项目,因此服务器不需要图形环境。 所有这些点的结合意味着servlet将不会被配置为访问图形环境,也没有机会显示弹出对话框;因为,没有可用于显示对话框的图形环境


一般来说,不能将swing/awt代码与servlet混合使用;但是,swing和awt中都有一部分图形操作可用,它们允许在不需要图形环境的情况下进行图像处理。这是为了简化在文件处理环境中转换和构建图像的开发,在该环境中,程序永远不会显示图像。以.png到.jpg转换器为例,如果它从不显示图像,程序可以打开图像来完成工作,然后关闭图像而不需要图形卡。

Java servlet代码在webserver上运行,而不是在webclient webbrowser上运行。Web服务器所做的一切就是监听HTTP请求,生成HTML/CSS/JS响应并将其发送到webclient。webclient所做的只是发送HTTP请求和处理检索到的HTML/CSS/JS响应

如果在servlet中执行Swing GUI,它将显示在Web服务器中,而不是webclient中

对于这个特殊问题,基本上有3种解决方案:

改为在webclient上运行Swing GUI代码。您可以在一个或的风格中完成这项工作,它由JSP/HTML页面提供服务

改用客户端编程/脚本语言,例如JavaScript或ActionScript Flash。在JavaScript中有一个显示对话框的警报函数

在JSP中使用JSTL和/或EL等标记库有条件地呈现HTML/CSS/JS内容。最终可以与解决方案2结合使用


Java servlet代码在webserver上运行,而不是在webclient webbrowser上运行。Web服务器所做的一切就是监听HTTP请求,生成HTML/CSS/JS响应并将其发送到webclient。webclient所做的只是发送HTTP请求和处理检索到的HTML/CSS/JS响应

如果在servlet中执行Swing GUI,它将显示在Web服务器中,而不是webclient中

对于这个特殊问题,基本上有3种解决方案:

改为在webclient上运行Swing GUI代码。您可以在一个或的风格中完成这项工作,它由JSP/HTML页面提供服务

改用客户端编程/脚本语言,例如JavaScript或ActionScript Flash。在JavaScript中有一个显示对话框的警报函数

在JSP中使用JSTL和/或EL等标记库有条件地呈现HTML/CSS/JS内容。最终可以与解决方案2结合使用


为什么要在servlet中打开本地对话框…?重新格式化的代码;如果不正确,请还原。实际尝试在线程完成时显示确认。所以,我试图用上面的想法来显示它,但我想在客户端显示它;如果不正确,请还原。实际尝试在线程完成时显示确认。所以我试着用上面的想法来显示它,但我希望它在客户端。这是真的,但我有多个线程在服务器端运行,所以当特定线程完成任务时,如何在客户端的同一页面中显示对话框。我已经回答了这个问题。我认为选项2结合Ajax是最好的。这是真的,但我在服务器端运行多个线程,所以当特定线程完成任务时,如何在客户端的同一页面中显示对话框。我已经回答了这个问题。我认为选项2与Ajax的结合是最好的。谢谢你的链接。在这种情况下,正确的解决方案是使用日志记录,但我想如果您习惯于弹出对话框,当它不可用时,可能会令人惊讶。感谢链接。在这种情况下,正确的解决方案是使用日志记录,但我想如果您习惯于弹出对话框,那么当它不可用时,可能会令人惊讶。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless());
if(!ge.isHeadless()){ 
    System.setProperty("java.awt.headless", "true");
}