Как уже говорилось в комментариях, вы синхронизируете разные объекты, поэтому нет никакой координации между потоками.
Вместо этого вам нужно, чтобы потоки совместно использовали объект, с которым они синхронизируются. Вы можете создать этот объект в Main
или OpenServerSockets
, а затем передать его в конструктор ClientResponder
, а затем ClientResponder
может синхронизироваться с этим объектом.
Но есть и другие возможные проблемы:
- Непонятно, почему
OpenServerSockets
должно быть Thread
- Кажется странным, что
OpenServerSockets
постоянно порождает новые темы в узкой петле - Вы заключаете весь метод
ClientResponder
run
в один блок synchronized
. Это означает, что на протяжении всей полезной жизни потока он удерживает блокировку. Кажется, вряд ли это то, что вам нужно. - В целом, лучше реализовать
Runnable
, чем расширять Thread
, а затем передать экземпляр класса, реализующего Runnable
, в new Thread
.
Re # 2: ClientResponder
run
должно вместо этого выглядеть примерно так:
public void run(){
while (this.running) {
synchronized (this.objectToSynchronizeOn) {
// Do one unit of work that requires synchronization
}
}
}
Таким образом, каждый из потоков получает шанссделать что-то промежуточное между работой, выполняемой другими потоками.