У меня есть приложение (на стороне сервера), которое сидит на порту и прослушивает клиентские соединения.
Как только соединение установлено, приложение запускает парсер (другой поток), который имеет дело с этим соединением.
Моя проблема в том, что в некоторые моменты (поскольку анализ может занять много времени), серверное приложение запускает новый поток, в то время как другие обрабатываются. Это желаемое поведение, а не проблема как таковая. происходит то, что новый поток, кажется, читает некоторую переменную состояния из старого потока и поэтому действует неправильно.
В общем, парсер делает следующее:
клиент всегда отправляет два пакета; первый в основном пакет детонационного стука, а второй - реальный пакет данных.
Я читаю первое, и если я решаю принять его, я помещаю его в переменную, чтобы можно было прочитать следующий пакет.
В описываемом сценарии первый поток читает пакет детонации и проверяет его.
Приходит следующий пакет (в том же потоке) и начинается анализ.
В то же время создается другой парсер, который ожидает свой первый пакет;
Затем происходит (проблема) то, что он проверяет переменную проверки (которая должна быть ложной для этого потока), и находит, что она в порядке (читает из предыдущего потока, который все еще выполняется) и продолжает анализировать стук выбить пакет, как если бы это был пакет данных.
То, на что я обращаюсь - это способ полностью исключить обмен данными. я использую следующий класс для отслеживания состояния сеанса:
public class SessionInfo {
private Constants.PacketValidity validity;
private int packetSize;
private String IMEI;
private int packetReportedSize;
private Constants.PacketType packetType;
private int codec;
private int records;
private boolean valid;
private Constants.ResponseType responseType;
private String clientIP;
private int serverPort;
private Date parseInit;
private Date parseEnd;
}
Кроме того, в классе есть множество сеттеров и геттеров.
синтаксический анализатор имеет экземпляр этого объекта в качестве частного поля.
Как бы мне этого добиться?