您好我正在尝试创建一个服务器/客户端程序,最多需要5个客户端通过多个服务器端线程输入一个字符串,这些字符串将被添加到团队类,即同一团队,然后当团队是完整,客户端断开连接,服务器等待下一个团队的名称。
我的问题在于创建每个线程更新到的类Team的实例。 我不知道在哪里声明类的实例?(它包含一个字符串数组[5]) 我在服务器端的课程目前是“TeamServer”,“TeamServerThread”“团队”“streamSocket”
下面是我的“TeamServerThread”,它当前正在使用用户字符串,只是将其添加到另一个字符串中。
import java.io.*;
class TeamServerThread implements Runnable {
static String names ="";
MyStreamSocket myDataSocket;
TeamServerThread(MyStreamSocket myDataSocket) {
this.myDataSocket = myDataSocket;
}
public void run( ) {
String newName;
try {
newName = myDataSocket.receiveMessage();
/**/ System.out.println("Name Recieved = "+newName);
updateNames(newName);
// now send the names to the requestor
// wait
myDataSocket.sendMessage(names);
myDataSocket.close();
}// end try
catch (Exception ex) {
System.out.println("Exception caught in thread: " + ex);
} // end catch
} //end run
private synchronized void updateNames (String newName) {
names +=newName + "\n";
// this.team.add(newName);
} // end updateNames
} // end Team
这是我的“团队”课程
public class Team
{
public final int TEAM_SIZE = 5;
public String names[] = new String[TEAM_SIZE];
public int num_members = 0;
// waits until five names have arrived
// needs to be synchronized because it can be accessed
// by a number of concurrent threads
synchronized void add(String name)
{
names[num_members] = name;
num_members++;
if (num_members < TEAM_SIZE)
try
{
wait();
}
catch(Exception e) {}
else
try
{
notifyAll();
}
catch(Exception e){}
} // end add
public int Getnum_members()
{
return num_members;
}
} // end Team
答案 0 :(得分:0)
所有类加载都是单线程的,您不能使用多个线程来添加/更新类。但是我认为这不是你的意思。
您需要拥有每个套接字都可以看到它的团队。您遇到的问题是您没有同步访问或更换团队,因此您可能会遇到竞争条件,即太多客户试图将自己添加到同一团队。
我建议您使用某种类型的TeamCoordinator传递给每个套接字连接,这可以确定何时应该将Team添加到客户端。