2011-08-09 3 views
0

포트에 앉아 클라이언트 연결을 수신하는 응용 프로그램 (서버 측)이 있습니다. 연결되면 앱은 해당 연결을 처리하는 파서 (다른 스레드)를 실행합니다.자바 스레드가 데이터를 공유하지 못하게 하시겠습니까?

내 문제는 다른 부분이 처리되는 동안 서버 응용 프로그램이 새 스레드를 시작한다는 점입니다. 이것은 바람직한 행동으로, 문제 자체가 아닙니다. 새로운 스레드가 이전 스레드에서 일부 상태 변수를 읽으므로 잘못 작동하는 것입니다.

느슨하게 파서가하는 것은 다음과 같습니다. 클라이언트는 항상 두 개의 패킷을 보냅니다. 첫 번째는 기본적으로 노크 노크 패킷이고 두 번째는 실제 데이터 패킷입니다. 나는 첫 번째를 읽고, 내가 그것을 받아들이기로 결정하면, 다음 패킷을 읽을 수 있도록 변수에 넣는다.

am 시나리오에서 첫 번째 스레드는 노크 노크 패킷을 읽고이를 확인합니다. 다음 패킷이 (동일한 스레드에서) 도착하고 구문 분석이 시작됩니다.

한편, 다른 파서가 만들어지고 첫 번째 패킷을 기다립니다. 그런 다음 (이 문제는) 유효성 검사 변수 (이 스레드에 대해 false 여야 함)를 확인하고 ok (여전히 실행중인 이전 스레드에서 읽음)를 찾은 후 노크 패킷을 마치 데이터 패킷처럼 노크하십시오.

lokoing for은 데이터 공유를 완전히 제거하는 방법입니다. 세션 상태를 추적하기 위해 다음 클래스를 사용하고 있습니다 :

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

이 클래스는 setter와 getter를 많이 가지고 있습니다.

파서는이 개체의 인스턴스를 개인 필드로 사용합니다.

어떻게하면 좋을까요?

+0

스레드를 만들고 변수를 확인하는 코드를 보여주십시오. – DaveJohnston

+0

두 패킷 쌍이 동일한 세션에 있어야합니까? 같은 세션에있는 경우 대화와 같은 것을 만들어야합니다. 즉 SessionInfo는 ConversationInfo와 유사하며 여러 인스턴스가 있어야합니다. – tkr

답변

2

파서는이 개체의 인스턴스를 개인 필드로 사용합니다.

이것은 사용자의 문제입니다. 해결 방법은 새로운 SessionInfo을 만들고 메서드 인수로 파서에 전달하여 추가 메서드 호출에 전달하는 것입니다. 이렇게하면 세션 상태에 대한 참조가 현재 스레드 실행에 로컬이됩니다.

파서에 구문 분석 중에 업데이트되는 개인 속성이 더 많이 포함되어있는 경우이를 추출해야합니다. 개인 하위 클래스에서 이들을 결합하고 구문 분석을 위해 호출 될 때 해당 클래스의 인스턴스를 작성하면 해당 문제에 대한 가능한 해결책이 될 수 있습니다.

2

두 개의 개별 스레드가 두 개의 개별 SessionInfo 인스턴스를 사용하는지 확인해야합니다.

이렇게하는 가장 쉬운 방법은 새 파서 인스턴스를 만들어서 새 SessionInfo 인스턴스를 만드는 것입니다. 별도의 인스턴스가 있는지 확인한 후에는 잘해야합니다.

관련 문제