0

我正在尝试创建一个具有多线程概念的 Java 套接字程序。从客户端到服务器的每个连接都是一个线程。每个客户端都将他们的信息发送到服务器。

我想问一下如何从线程中收集所有值并将它们全部放入一个字符串数组中?

需要同步所有这些线程吗?

如果只使用Thread t = new Thread()而不是有什么不同Thread[] t = new Thread(client)

我是否适合使用Thread[]从线程中收集所有项目的开始步骤?

使用线程有用join()吗?

这是创建线程的部分,

    public void listenSocket(int client){ 
        int i=0;

        Thread[] t = new Thread[client];
        while(i<client){
            ClientWorker w;
              try{  
                    w = new ClientWorker(server.accept());
                    t[i] = new Thread(w);
                    t[i].start();
                    System.out.println(t[i].getName());
              } catch (IOException e) {
                    System.out.println("Accept failed: 4444");
                    System.exit(-1);
              }
        i++;
        }
}

这是线程在做什么的一部分

class ClientWorker implements Runnable{
    Socket client;
        String ip;
        String load;
        String data[]=new String[7];


        ClientWorker(Socket client){
        this.client = client;
    }

    public void setIP(String ip){
            this.ip = ip;
        }

        public void setData(String load){
            this.load = load;
        }

        public void getIP(){
           System.out.println(ip);
        }

        public void getData(){
           System.out.println(load);
        }

    public void run(){

        BufferedReader in = null;
        PrintWriter out = null;
                XmlGenerator xml = new XmlGenerator();
        try{
          in = new BufferedReader(new InputStreamReader(client.getInputStream()));
          out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) {
          System.out.println("in or out failed");
        }
                while(true){
                    try{
                        String a = in.readLine();
                        setData(a);
                        String b = client.getRemoteSocketAddress().toString();
                        setIP(b);
                        out.println(a);
                        getData();
                        getIP();
                       }
                    catch (IOException e) {
                        System.out.println("Read failed");
                       }
                }

    }

}`

我已经阅读了有关同步、可调用线程的主题,但我什么也没找到。抱歉重新发布。

4

1 回答 1

1

有两种方法可以回答这个问题:

第一种方式:

我想问一下如何从线程中收集所有值并将它们全部放入一个字符串数组中?需要同步所有这些线程吗?

如果您打算以这种方式收集结果,那么是的,有必要显式同步线程对该数组的使用。

如果只使用 Thread t = new Thread() 而不是 Thread[] t = new Thread(client) 有什么不同?

目前尚不清楚您的意思,但无论哪种方式,如果您有两个线程访问/更新相同的数据结构,那么它们需要同步以使应用程序可靠/可移植。

我是否适合使用 Thread[] 从线程中收集所有项目的开始步骤?

这是一种方法。但是有更好的方法。

使用 thread join() 有用吗?

如果您要尝试在此级别解决此问题,那么它可能会很有用。

问题是你的代码并没有让我相信你清楚地知道你在做什么。或者换句话说,没有设计的证据。如果我们无法弄清楚您认为您的代码应该如何工作,那么真的不可能给您具体的建议。该代码当然似乎与您在问题开始时所说的内容不一致...


回答这个问题的第二种方法是,从 Java 5 开始,“java.util.concurrent”包为实现多线程系统提供了广泛的“现成”组件。您似乎试图实现的内容听起来很适合ExecutorService. 它可以处理创建和管理线程的所有低级细节,并允许应用程序通过Future. 这消除了对显式同步的需求…… ExecutorServiceandFuture实现会解决这个问题。

所以,我的建议是阅读 JavadocsExecutorService等,并弄清楚如何使用它来做你想做的事情。如果你这样做,你的代码可能会更好。

于 2012-08-14T02:07:23.993 回答