所以这里的代码应该是我错误的来源:
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();
}
}
答案 0 :(得分:0)
“这是我第一次创建线程,因此线程无法正在运行。”
我认为你错了。使用调试器,或向我们展示您的线程类。
答案 1 :(得分:0)
构造函数也启动线程:
public ServerThread(ServerSocket ss, Configuration newConfig) {
super();
serverSocket = ss;
config = newConfig;
start();
}
当ServerThread构造函数返回时,该线程已经启动,因此您不能在构造函数外调用start()。
或者,或许更好,您可以从构造函数中删除start()调用,并将其限制为创建ServerThread对象的主要工作。