ОК, есть несколько проблем с этим кодом
- Вы получаете доступ к множеству полей из разных экземпляров
Thread
без каких-либо шагов синхронизации.Это может привести к странным ошибкам, связанным с многопоточностью - У вас нет доступа к компонентам Swing в потоке отправки событий .Это может быть хорошей идеей, чтобы прочитать о Swing Concurrency
- Пожалуйста, начните использовать приличные имена переменных, которые облегчили бы чтение вашего кода
Однако ни один из этих пунктов не является реальной проблемой.Проблема в том, что вы, вероятно, думаете, что ваш (и да, я переименовал некоторые переменные)
while ( true ) {
Socket ss = server.accept();
BufferedReader br = new BufferedReader( new InputStreamReader( ss.getInputStream() ) );
String alarmTimeFromSocket = br.readLine();
alarmTimeTextField.setText( alarmTimeFromSocket );
if ( alarmTimeFromSocket.endsWith( currentTime ) ) {
color = JColorChooser.showDialog( GraphicsServer.this, "Choose a color", color );
contentPane.setBackground( color );
}
}
работает постоянно, что не так.Вызов br.readLine()
является блокирующим вызовом.Следовательно, Thread
постоянно ожидает ввода.Как только он получает новое время будильника, он немедленно выполняет следующий фрагмент кода (сравнение), а затем снова начинает ждать ввода.
Таким образом, твой код сравнения выполняется только в тот момент, когда ты установил время будильника,и не постоянно, когда время обновляется.
Кроме того, я думаю, что endsWith
неверно (или вы не можете установить время, включая секунды от клиента, в этом случае оно будет работать, но тогда вы могли бы легкоиспользуйте equals
вместо endsWith
)
Возможным решением вашей проблемы является сравнение времени будильника и текущего времени стены в цикле, которое обновляет время стены на стороне сервера.Но опять же, вы можете покончить со странными проблемами с потоками, если другой Thread
обновит поле времени будильника в тот же момент, когда вы сравните его со временем стены в wall-time-updater- Thread