您好,我正在尝试创建一个多线程I`m服务器,我已经介绍了Link 1 Link 2
import java.net.*;
import java.io.*;
public class WebServer {
ServerSocket server;
public WebServer() {
try {
server=new ServerSocket(3000);
} catch (IOException ex) {
System.out.println("exc in const "+ex.getMessage());
}
}
Socket client;
BufferedReader br;
Thread t=new Thread(new Runnable(){
@Override
public void run() {
try{
System.out.println(br.readLine());
}
catch(Exception e){
System.out.println("exc is "+e);
}
}
});
public void RUN(){
while(true){
try {
client=server.accept();
System.out.println(client.getPort());
if(client!=null){
r=new BufferedReader(new InputStreamReader(client.getInputStream()));
t.start();
}
} catch (IOException ex) {
System.out.println("ex is "+ex.getMessage());
}
}
}
public static void main(String[] args) {
WebServer webserver=new WebServer();
try {
webserver.RUN();
} catch (Exception e) {
System.out.println("main "+e);
}
}
}
在上面的代码中,我一直得到一个线程非法访问异常,那么为什么我一直得到这个异常呢?我想在浏览器中打开多个选项卡,打开localhost:3000,然后服务器必须打印http请求和端口号,但这只发生在第一个客户端,而不是其他客户端,它显示illegalThreadAccess异常,程序终止
如果有任何页面告诉我们如何在how浏览器中显示某些内容,我将非常感谢。
发布于 2013-09-22 03:06:04
您可以在Thread类的文档中看到,如果线程已经启动,则方法start()抛出IllegalThreadStateException。
在您的代码中,您只创建线程一次,并且尝试多次运行它。
如何修复?行前:
t.start();
你应该创建新的线程
Thread t=new Thread(new Runnable(){
@Override
public void run() {
try{
System.out.println(br.readLine());
}
catch(Exception e){
System.out.println("exc is "+e);
}
}
});
编辑:关于评论中的问题的。当你启动线程时,它就开始自己的活动了。你可以例如。通过调用线程对象上的join()
方法等待终止。Thread
类的规范说明了它是如何工作的,并且说您不能重新运行它。
https://stackoverflow.com/questions/18936113
复制相似问题