1

我收到了 IllegalThreadStateException。

在 Eclipse 的调试器下一切正常,但是当我尝试在 Firefox 上对其进行测试时,它开始失败。第一次运行没问题,刷新网页后我得到了那个异常。

这是代码:

public void init() {
    try {           
        SwingUtilities.invokeAndWait(new Runnable() 
        {
            public void run() 
            {                   
                createGUI();
                createConnection();
            }
        });
    } 
    catch (Exception e) 
    { 
        System.err.println("createGUI didn't complete successfully");
        e.printStackTrace();
        System.err.println(e.toString());
    }
}


private void createConnection()
{       
    _connectionThread = ConnectionThread.getInstance();
    _connectionThread.setServer(getCodeBase().getHost());
    _connectionThread.start(); <------ Exception        
}

我是 Java 新手,这是我的第一个小程序。我知道我做错了什么,但我找不到它是什么。

编辑:从控制台

java.lang.reflect.InvocationTargetException
at java.awt.EventQueue.invokeAndWait(Unknown Source)
at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)
at com.onlinegame.gameclient.GameClient.init(GameClient.java:76)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Unknown Source)
    at com.onlinegame.gameclient.GameClient.createConnection(GameClient.java:175)
    at com.onlinegame.gameclient.GameClient.access$100(GameClient.java:34)
    at com.onlinegame.gameclient.GameClient$1.run(GameClient.java:81)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.reflect.InvocationTargetException
4

1 回答 1

0
 _connectionThread = ConnectionThread.getInstance();

看起来 ConnectionThread 是一个单例(是真的吗?)并扩展了 Thread。如果这是正确的,您可能会遇到问题,因为线程只能启动一次(Thread.start())。如果您尝试再次启动同一个 Thread 实例,它将失败并显示java.lang.IllegalThreadStateException.

要解决这个问题,请在每个请求上创建一个新的 Thread 对象或将执行结果缓存在单例中。如何准确地实现它取决于你想用线程实现什么以及你的应用程序的设计。

于 2012-11-12T11:08:24.887 回答