我对线程有点陌生,似乎在网上找不到我需要的东西。我试图解决的问题是让多个客户机连接到一个服务器,并同时运行。客户机的数量是任意的,客户机应该可以随时连接。为此,我创建了“server”类,它存储有关客户机的所有信息,基本上就是中心。然后我有一个助手类“userthread”,它实现runnable,每个userthread都可以连接到一个客户机。我遇到的问题是同时运行多个用户线程。以下是我目前在server类中用于创建新userthreads的代码:
int currentPort = 1;
while (true) {
System.out.println(currentPort);
System.out.println("waiting for user to connect");
Thread thread = new Thread(new UserThread(currentPort, this));
thread.start();
// A
System.out.println("Connected");
currentPort++;
}
下面是userthread的run方法:
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
// B
} catch (Exception e) {
e.printStackTrace();
}
// down here doesn't effect my question so I excluded it
}
我在每一篇文章中都把a和b标记为注解。最初,当我只是使用运行的userthread的单个示例进行测试时,我能够用“user.join();”替换这允许userthread运行,但它停止了服务器中的while循环。我需要的,可能不是我认为的那样存在的,是一些代码放在点a中,暂停while循环,直到在userthread中调用行b。然后,服务器和新的用户线程都将继续同时工作。如果另一个用户连接到服务器,则会创建另一个userthread,这三个线程都将继续工作。这应该适用于任意数量的连接用户。到目前为止,我已经尝试用“user.wait()”替换a,用“this.notify()”替换b,但我认为这两种方法都没有达到我认为的效果。user.wait()最终抛出“java.lang.illegalmonitorstateexception:当前线程不是所有者”。我试着用我在网上看到的一篇文章中的synchronized(user){}来包围它,但它仍然抛出了相同的异常。在这一点上我很迷茫,所以我希望任何可能的见解。是否存在这样的代码行来替换a和b,或者我以完全错误的方式处理这个问题?谢谢你的帮助。
1条答案
按热度按时间zpjtge221#
这里有几个问题:
等待并通知
他们会在这里工作,但你不能打电话
x.wait/notify/notifyAll
除非你在synchronized(x)
阻止。而x.wait()
在等待,你不会握着那把锁;一旦wait()返回,您将重新获得它。这不是怎么做的
你做了一个单人
ServerSocket
对象,以及一个将重复执行此操作的线程:呼叫
accept()
在serversocket对象上。创建新线程;把它递给我
Socket
从那个电话里说出来的。开始那条线
回到开头
您的解决方案很奇怪,而且确实需要同时启动所有线程,监听大量端口(没有特殊原因),从而严重限制传入连接。
然后,如果您想让这些线程中的任何一个等待直到某个事件发生,可以使用wait/notify,或者更好的方法,比如使用j.u.c.的东西,
CountDownLatch
允许您安全地等待x个事件发生,例如,让用户线程对闩锁进行倒计时,并让其他线程等待4个倒计时:这就是您编写等待4个连接进入的软件的方式。关于如何在java中执行多线程的完整教程只是超出了合理问题的范围。