java - 两个线程都停留在Java中的等待状态
问题描述
我有一个服务器和两个客户端,服务器启动两个线程(ServerHandler),它们都通过Socket
相应客户端的 TCP 连接开始连接到服务器。
预期行为:
一个 ServerHandler 线程向客户端发送消息,而另一个 ServerHandler 线程等待wait()
......然后工作线程通知睡眠线程并等待......等等。
实际行为:
两个 ServerHandler 同时等待。他们都进入了不应该出现的同步块,一个线程应该在等待而另一个线程工作。
ServerHandler 的代码片段(它的两个实例正在运行)
private static Object lock = new Object();
...
@Override
public void run() {
System.out.println(String.format(" --> Server handler: %s is in run method...", serverID));
while (true) {
synchronized (lock){
while (!Server.isFinished()) {
try {
System.out.println(String.format(" --> Server handler: %s is waiting...", serverID));
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
System.out.println(String.format(" --> Server handler: %s is ready to send board...", serverID));
Server.setFinished(true);
sendBoard();
notify();
}
}
}
注意:
该类Server
启动两个 ServerHandler 线程。默认 finished
设置false
输出:
CLIENT connected!
<-- I'M Alan I want to play!
--> Server handler 1 instantiated!
CLIENT connected!
<-- I'M Bot I want to play!
--> Server handler 2 instantiated!
HANDLER started...
HANDLER started...
--> Server handler: 1 is in run method...
--> Server handler: 2 is in run method...
--> Server handler: 1 is waiting...
--> Server handler: 2 is waiting...
预期行为:
CLIENT connected!
<-- I'M Bot I want to play!
--> Server handler 1 instantiated!
CLIENT connected!
<-- I'M Alan I want to play!
--> Server handler 2 instantiated!
HANDLER started...
HANDLER started...
--> Server handler: 1 is in run method...
--> Server handler: 1 is waiting...
--> Server handler: 2 is in run method...
--> Server handler: 2 is ready to send board...
...
谢谢!
解决方案
您能否提供一些示例来说明您的预期输出是什么?
似乎是一个意外错误的一件事是两个线程都有自己的锁,而不是共享一个(注意static)。
另一件没有意义的事情是在您已经拥有的锁上调用notify。
private static Object lock = new Object();
public void run() {
while (true) {
synchronized (lock) {
while (!Server.isFinished()) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
Server.setFinished(true);
sendBoard();
}
}
}
推荐阅读
- python - 错误不能将序列乘以“浮点”类型的非整数
- c# - Bot Framework 搞乱了对话框状态
- python - 如何在 celery 中测试 on_failure
- javascript - 复选框 ace.js(在线编辑器)
- python - 静态 django 2 的 TemplateSyntaxError
- feathersjs - $ne 在 MongoDB 查询中不起作用
- symfony - Symfony Doctrine 序列化深度关系
- c++ - 在初始化列表中使用取消引用的指针初始化变量
- validation - Xtext - 验证重复名称
- python - 如何在 Python 中使用 numpy 将数组的值替换为另一个数组