我正在为聊天客户端-服务器应用程序编写一个测试,我创建了 10 个套接字 - 每个套接字都向其他 9 个套接字发送一条消息,这会触发服务器通过 ExecutorService 创建 10 个线程并发送消息。发送所有 10*9=90 条消息需要一些时间,但是我如何验证所有 10 个线程都已完成这项工作(线程没有终止,它们继续运行)。我想知道是否可能是从一个套接字并在该条件下等待,直到每个套接字达到 9 个接收到的消息,如果不是,我该怎么办?而且我不应该修改客户端和聊天代码,但是我可以自由地在测试中编写任何内容,以下是我如何创建 10 个套接字并将消息发送到当然已启动的服务器:
for (int i = 0; i < 10; i++) {
try {
Socket socket = new Socket("127.0.0.1", 3000);
allsockets.add(socket);
final PrintWriter stream = new PrintWriter(socket.getOutputStream(), true);
stream.println("someMessage");
} catch (IOException e) {
e.printStackTrace();
}
}
最佳答案
这是一个非常专业的问题,但考虑到您提供的信息,使用 volatile
变量可能是值得的。
public static volatile int messagesReceived = 0;
使用关键字 volatile
意味着JVM使用lock
以确保一次只有一个线程可以修改该变量。
然后,每个套接字在完成其工作后都应增加此 messagesReceived
变量。一旦 messagesReceived
变量达到 10,或者您生成的线程数,那么您就可以确定它们都已完成该工作。
//Your initialization here.
while (messagesReceived < threadCount){
Thread.wait(100);
}
//All threads have done the job.
但是,根据套接字的实现,可能有必要允许它们访问增加计数器变量的公共(public)变元方法。
关于java - 从套接字接收到的消息数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49804311/