创建线程时出现IllegalThreadStateException

时间:2013-12-01 17:11:24

标签: java multithreading illegalstateexception

所以这里的代码应该是我错误的来源:

try {
config = new Configuration(configFile);
} catch (ConfigurationException e1) {}

try {
    // Create a ServerSocket 
    ss = new ServerSocket(PORT);
    System.out.println("Server bound at port " + ss.getLocalPort());
}catch (Exception e) {}

new ServerThread(ss, config).start();

这是我第一次创建线程,因此线程无法运行。 我创建后我也没有再次引用这个线程所以我不确定我是如何得到IllegalThreadStateException的。

这是堆栈跟踪:

Exception in thread "Thread-3" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at HttpServer.<init>(HttpServer.java:36)

任何帮助都会非常感激。

编辑: 将线程启动代码更改为:

ServerThread initServerThread = new ServerThread(ss, config);
System.out.println(initServerThread.getState().toString());
initServerThread.start();

线程状态为“RUNNABLE”

这里也是线程类...

public class ServerThread extends Thread {

ServerSocket serverSocket;
Socket nextClient;
Configuration config;

public ServerThread(ServerSocket ss, Configuration newConfig) {
    super();
    serverSocket = ss;
    config = newConfig;
    start();
}

public void run() {
    try {
        nextClient = serverSocket.accept();
    } catch (IOException e) {
        System.err.println(e);
        System.err.println("Usage: java HttpRequest <port>");
    }

    // Create new thread to listen for next incoming connection.
    new ServerThread(serverSocket, config).start();

    try {
        nextClient = serverSocket.accept();
    } catch (IOException e) {}

    HttpRequestHandler httpHandler = new HttpRequestHandler(nextClient, config);
    httpHandler.parseHttpRequest();
    }
}

2 个答案:

答案 0 :(得分:0)

“这是我第一次创建线程,因此线程无法正在运行。”

我认为你错了。使用调试器,或向我们展示您的线程类。

答案 1 :(得分:0)

构造函数也启动线程:

public ServerThread(ServerSocket ss, Configuration newConfig) {
    super();
    serverSocket = ss;
    config = newConfig;
    start();
}

当ServerThread构造函数返回时,该线程已经启动,因此您不能在构造函数外调用start()。

或者,或许更好,您可以从构造函数中删除start()调用,并将其限制为创建ServerThread对象的主要工作。