为什么Swing应用程序会停止我的Javaservlet?

为什么Swing应用程序会停止我的Javaservlet?,java,swing,servlets,Java,Swing,Servlets,我有一个Swing runnable应用程序更新消息,然后我有一个Java servlet从Paypal IPN(即时支付通知)获取消息,当servlet启动时,在init()中,我启动Swing runnable应用程序打开桌面窗口,但30分钟后Swing中的错误导致servlet停止,怎么会发生这种情况?因为runnable在它自己的线程上运行,所以servlet启动了该线程,为什么该线程中的错误会导致servlet停止 public class License_Manager extend

我有一个Swing runnable应用程序更新消息,然后我有一个Java servlet从Paypal IPN(即时支付通知)获取消息,当servlet启动时,在init()中,我启动Swing runnable应用程序打开桌面窗口,但30分钟后Swing中的错误导致servlet停止,怎么会发生这种情况?因为runnable在它自己的线程上运行,所以servlet启动了该线程,为什么该线程中的错误会导致servlet停止

public class License_Manager extends JPanel implements Runnable
{
  License_Manager()
  {
    Do_GUI();
    ...
    start();
  }

  public static void main(String[] args)
  {
    // Schedule a job for the event-dispatching thread : creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { Create_And_Show_GUI(); } });
  }
}

public class PayPal_Servlet extends HttpServlet
{
  public void init(ServletConfig config) throws ServletException
  {
    super.init(config);
    License_Manager.main(null);
  }

  protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
  {
  }
}
除此之外,错误与我的代码没有任何关系,它看起来是这样的:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 17 >= 0
    at java.util.Vector.elementAt(Vector.java:427)
    at javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:70)
    at javax.swing.plaf.basic.BasicListUI.paintCell(BasicListUI.java:191)
    at javax.swing.plaf.basic.BasicListUI.paintImpl(BasicListUI.java:304)
    at javax.swing.plaf.basic.BasicListUI.paint(BasicListUI.java:227)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
    at javax.swing.JComponent.paintComponent(JComponent.java:763)
    at javax.swing.JComponent.paint(JComponent.java:1029)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JViewport.paint(JViewport.java:747)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

编辑:


感谢所有回复,似乎在init()中启动线程是个坏主意,我最初的想法是,我的Swing GUI应用程序处理servlet获取的所有消息并写入文件夹,我可以看到GUI在屏幕上工作,而servlet在后端获取消息,它们是相关的,因此,我同时运行这两个进程,启动servlet也会在init()中自动启动GUI,现在我可以分别启动这两个进程,这样无论GUI发生什么情况,servlet都不会停止

看起来确实很古怪。在sun(现在的oracle)论坛上看到了类似的东西。直到现在还没有好的答案。但也许你可以得到一个线索,因为它似乎是相同的问题
Link

如果我说的是显而易见的,那就很抱歉了,但是看起来您的GUI中有一个JList,并且它的支持模型在绘制时被清空了。它至少需要18个元素,并显示有0个。你是否在某个地方修改了事件调度线程之外的列表内容?

@Frank:我确实将PayPal的IPN与Java Webapps集成在一起,我对你的问题感到困惑。您正在从Servlet运行Swing应用程序?你在一个“人头攒动”的系统上运行一个Web应用程序,当支付PayPal付款时,服务器会弹出一个Swing应用程序@弗兰克:除此之外,我真的不明白你想做什么,据我从你的问题中看到的,“可运行的是*不是在自己的线程中运行”*[sic]。它使用SwingUtilities.invokeLater在EDT上运行,您的崩溃正在EDT上发生。你不知怎么搞砸了/锁定了EDT。@Wizardofods:既然你已经完成了Paypal IPN,你知道为什么即使在我从servlet中取出GUI应用程序后,它仍会时不时地失败吗?当我第一次启动它时,我收到一些消息,但过了一段时间,它失败了,为什么?我使用沙盒发送测试消息,它不可靠吗?我希望您知道,在这种情况下,Swing在服务器机器上运行,而不是在客户端机器上运行?如果您的目的是在客户端计算机上运行它,请查看applet/webstart角落。是的,在我的家用笔记本上,它充当服务器,因此我可以监视消息传递活动。