2012-08-14 77 views
0

我正尝试使用多线程概念创建Java套接字程序。 从客户端到服务器的每一个连接都是一个线程。每个客户端都将他们的信息发送到服务器。从线程中收集值并将值保存到数组中java socket

我想问如何从线程中收集所有的值,并把它们全部放在字符串数组中?

是否需要同步所有这些线程?

如果只使用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"); 
         } 
       } 

    } 

}` 

部分我读过关于同步,调用线程的话题,但我什么也没发现。 抱歉转发。

+0

当你的代码片断显示,你只想实现一个'echo服务器',没有什么需要在这里同步。 – neevek 2012-08-14 01:49:55

+0

@Neevek你能否详细说明一下?我无法理解。十分感谢。 – irvana 2012-08-14 01:55:01

+0

当这些线程共享一些资源时(比如应用程序的状态,或者一个线程产生,另一个消耗的数据),您只需要同步线程。从你的代码我没有看到任何。 – neevek 2012-08-14 02:01:09

回答

1

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

第一种方式:

我想问问如何收集来自所有线程的价值和把他们都在一个字符串数组?是否需要同步所有这些线程?

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

如果只使用线程t =新线程()而不是线程[] t =新线程(客户端)有什么不同?

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

我是否正确使用Thread []从线程中收集所有项目?

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

使用线程连接()有用吗?

如果你想尝试在这个层面来解决这个问题,那么它可能是有用

问题是,你的代码并没有给我太多的信心,你对自己在做什么有清晰的认识。或换句话说,没有证据表明设计。如果我们无法弄清楚自己的代码应该如何工作,那么就不可能给出具体的建议。该代码肯定似乎不与你说你的问题开始的东西要排队......


第二种方式来回答这是从Java 5起,“java.util中.concurrent“软件包为实现多线程系统提供了广泛的”现成“组件。你似乎试图实现的声音听起来像是一个很好的匹配ExecutorService。它可以处理创建和管理线程的所有低级细节,并允许应用程序通过Future返回每个计算结果。这消除了对显式同步的需要...... ExecutorServiceFuture实现了这一点。

因此,我的建议是读取ExecutorService的Javadocs等,并找出如何使用来做你正在尝试做的事情。如果你这样做,你的代码可能会更好。

+0

谢谢兄弟,我会读它。是的,我不知道如何清楚地设计这个程序,但我只想收集客户端发送到一个阵列中的所有信息。我希望我可以在它内部实现循环,所以这个程序可以反复地完成它的工作 – irvana 2012-08-14 02:56:22