Остановить потоки Java от обмена данными? - PullRequest
0 голосов
/ 09 августа 2011

У меня есть приложение (на стороне сервера), которое сидит на порту и прослушивает клиентские соединения. Как только соединение установлено, приложение запускает парсер (другой поток), который имеет дело с этим соединением.

Моя проблема в том, что в некоторые моменты (поскольку анализ может занять много времени), серверное приложение запускает новый поток, в то время как другие обрабатываются. Это желаемое поведение, а не проблема как таковая. происходит то, что новый поток, кажется, читает некоторую переменную состояния из старого потока и поэтому действует неправильно.

В общем, парсер делает следующее: клиент всегда отправляет два пакета; первый в основном пакет детонационного стука, а второй - реальный пакет данных. Я читаю первое, и если я решаю принять его, я помещаю его в переменную, чтобы можно было прочитать следующий пакет.

В описываемом сценарии первый поток читает пакет детонации и проверяет его. Приходит следующий пакет (в том же потоке) и начинается анализ.

В то же время создается другой парсер, который ожидает свой первый пакет; Затем происходит (проблема) то, что он проверяет переменную проверки (которая должна быть ложной для этого потока), и находит, что она в порядке (читает из предыдущего потока, который все еще выполняется) и продолжает анализировать стук выбить пакет, как если бы это был пакет данных.

То, на что я обращаюсь - это способ полностью исключить обмен данными. я использую следующий класс для отслеживания состояния сеанса:

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;
}

Кроме того, в классе есть множество сеттеров и геттеров.

синтаксический анализатор имеет экземпляр этого объекта в качестве частного поля.

Как бы мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

синтаксический анализатор имеет экземпляр этого объекта в качестве частного поля.

Это ваша проблема.Решением было бы создать новый SessionInfo и передать его в качестве аргумента метода синтаксическому анализатору, передав его последующим вызовам метода.После того, как вы сделаете это, ссылка на состояние сеанса будет локальной для текущего выполнения потока.

Если ваш анализатор содержит больше закрытых атрибутов, которые обновляются во время синтаксического анализа, вам также необходимо извлечь их.Объединение их в закрытом подклассе и создание экземпляра этого класса при вызове синтаксического анализа будет возможным решением этой проблемы.

2 голосов
/ 09 августа 2011

Необходимо убедиться, что два отдельных потока используют два отдельных экземпляра SessionInfo.

Самый простой способ сделать это, вероятно, создать новый экземпляр синтаксического анализатора, который, в свою очередь, создаст новый SessionInfo пример.Как только вы убедитесь, что у них есть отдельные экземпляры, все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...