我正在尝试使用多线程概念创建一个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");
}
}
}
}`
我已经阅读了有关同步,可调用线程的主题,但我一无所获。 抱歉重新发布。
答案 0 :(得分:1)
有两种方法可以解答这个问题:
第一种方式:
我想问一下如何从线程中收集所有值并将它们全部放在一个字符串数组中?是否需要同步所有这些线程?
如果要以这种方式收集结果,那么有必要显式同步线程对该数组的使用。
如果只使用Thread t = new Thread()而不是Thread [] t = new Thread(client)会有什么不同?
目前尚不清楚您的意思,但无论哪种方式,如果您有两个线程访问/更新相同的数据结构,那么他们需要同步以使应用程序可靠/可移植。
我是否正确使用Thread []收集线程中的所有项目?
这是一种方法。但是有更好的方法。
使用线程join()?
是否有用
如果您打算在此级别尝试解决此问题,那么可能有用。
问题在于,您的代码并不能让我对您清楚知道自己在做什么充满信心。换句话说,没有设计的证据。如果我们无法弄清楚您的代码应该如何运作,那么实际上不可能给您提供具体的建议。代码当然不符合您在问题开头所说的内容......
回答这个问题的第二种方法是,从Java 5开始,“java.util.concurrent”软件包提供了广泛的“现成”组件,用于实现多线程系统。你似乎试图实现的声音听起来像ExecutorService
的良好匹配。它可以处理创建和管理线程的所有低级细节,并允许应用程序通过Future
获取每个计算的结果。这消除了对显式同步的需求...... ExecutorService
和Future
实现负责处理。
所以,我的建议是阅读ExecutorService
等的Javadocs,并弄清楚如何使用 来做你想做的事情。如果你这样做,你的代码可能会更好。