你如何创建一个线程,等待它做一些特定的事情,然后继续?
How do you create a thread, wait for it to do something specific, and then continue?
我对 Threads 有点陌生,似乎无法在网上准确找到我需要的东西。我要解决的问题是让多个客户端连接到服务器,并且 运行 同时连接。客户端的数量是任意的,客户端应该能够随时连接。为此,我创建了“服务器”class,它存储有关客户端的所有信息,本质上是一个集线器。然后,我有一个助手 class“UserThread”,它实现了 Runnable,并且每个 UserThread 都可以连接到一个客户端。我遇到的问题是 运行 同时设置多个 UserThreads。这是我目前在服务器 class 中用于创建新 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 的 运行 方法:
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 运行ning 的单个实例进行测试时,我能够将 A 替换为“user.join();”这允许 UserThread 运行,但它停止了服务器中的 while 循环。我需要的,但可能并不像我认为的那样存在,是一些放在 A 点的代码,它暂停 while 循环,直到在 UserThread 中调用 B 行。然后,Server 和新的 UserThread 都将同时继续工作。如果另一个用户连接到服务器,则会创建另一个 UserThread,并且所有三个都将继续工作。这应该适用于任意数量的连接用户。
到目前为止,我已经尝试将 A 替换为“user.wait()”,将 B 替换为“this.notify()”,但我认为它们中的任何一个都不符合我的预期。 user.wait() 最终抛出“java.lang.IllegalMonitorStateException:当前线程不是所有者”。然后我尝试用我在网上看到的 post 中的 synchronized(user){} 包围它,但它仍然抛出相同的异常。在这一点上我很迷茫,所以我想要任何可能的见解。是否存在这样的代码行来替换 A 和 B,或者我是否以完全错误的方式解决了这个问题?感谢您的帮助。
这里有几个问题:
等待并通知
他们会在这里工作,但你不能打电话给 x.wait/notify/notifyAll
,除非你在 synchronized(x)
街区内。在 x.wait()
等待期间,您不会持有该锁;一旦 wait() returns.
你就会重新获得它
这不是做服务器的方法
您制作了 1 个 ServerSocket
对象,以及一个将重复执行此操作的线程:
- 在 serversocket 对象上调用
accept()
。
- 创建一个新线程;将来自该调用的
Socket
交给它。
- 启动该线程
- 回到开头
您的解决方案很奇怪,确实需要您同时启动所有线程,侦听大量端口(无特殊原因),从而相当严格地限制传入连接。
然后,如果您希望这些线程中的任何一个等待某些事情发生,请使用 wait/notify,或者更好的是,来自 j.u.c 的东西。例如,CountDownLatch
让您可以安全地等到 X 件事发生,例如,让用户线程对锁存器进行倒计时,并让其他线程等待直到 4 次倒计时发生:这就是您编写等待直到的软件的方式4个连接进来了。
关于如何在 java 中执行多线程的完整教程 只是稍微 超出了合理的 SO 问题的范围。
我对 Threads 有点陌生,似乎无法在网上准确找到我需要的东西。我要解决的问题是让多个客户端连接到服务器,并且 运行 同时连接。客户端的数量是任意的,客户端应该能够随时连接。为此,我创建了“服务器”class,它存储有关客户端的所有信息,本质上是一个集线器。然后,我有一个助手 class“UserThread”,它实现了 Runnable,并且每个 UserThread 都可以连接到一个客户端。我遇到的问题是 运行 同时设置多个 UserThreads。这是我目前在服务器 class 中用于创建新 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 的 运行 方法:
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 运行ning 的单个实例进行测试时,我能够将 A 替换为“user.join();”这允许 UserThread 运行,但它停止了服务器中的 while 循环。我需要的,但可能并不像我认为的那样存在,是一些放在 A 点的代码,它暂停 while 循环,直到在 UserThread 中调用 B 行。然后,Server 和新的 UserThread 都将同时继续工作。如果另一个用户连接到服务器,则会创建另一个 UserThread,并且所有三个都将继续工作。这应该适用于任意数量的连接用户。 到目前为止,我已经尝试将 A 替换为“user.wait()”,将 B 替换为“this.notify()”,但我认为它们中的任何一个都不符合我的预期。 user.wait() 最终抛出“java.lang.IllegalMonitorStateException:当前线程不是所有者”。然后我尝试用我在网上看到的 post 中的 synchronized(user){} 包围它,但它仍然抛出相同的异常。在这一点上我很迷茫,所以我想要任何可能的见解。是否存在这样的代码行来替换 A 和 B,或者我是否以完全错误的方式解决了这个问题?感谢您的帮助。
这里有几个问题:
等待并通知
他们会在这里工作,但你不能打电话给 x.wait/notify/notifyAll
,除非你在 synchronized(x)
街区内。在 x.wait()
等待期间,您不会持有该锁;一旦 wait() returns.
这不是做服务器的方法
您制作了 1 个 ServerSocket
对象,以及一个将重复执行此操作的线程:
- 在 serversocket 对象上调用
accept()
。 - 创建一个新线程;将来自该调用的
Socket
交给它。 - 启动该线程
- 回到开头
您的解决方案很奇怪,确实需要您同时启动所有线程,侦听大量端口(无特殊原因),从而相当严格地限制传入连接。
然后,如果您希望这些线程中的任何一个等待某些事情发生,请使用 wait/notify,或者更好的是,来自 j.u.c 的东西。例如,CountDownLatch
让您可以安全地等到 X 件事发生,例如,让用户线程对锁存器进行倒计时,并让其他线程等待直到 4 次倒计时发生:这就是您编写等待直到的软件的方式4个连接进来了。
关于如何在 java 中执行多线程的完整教程 只是稍微 超出了合理的 SO 问题的范围。