0

嗨,我正在尝试创建一个多线程 Web 服务器,我提到了 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 请求和端口号,但这仅发生在第一次客户端而不是其他显示非法线程访问异常并且程序终止

如果有任何页面告诉如何在网络浏览器中显示某些内容,将不胜感激。

4

1 回答 1

1

正如您在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了它是如何工作的,并且它说你不能重新运行它。

于 2013-09-21T19:06:04.397 回答