簡體   English   中英

停止Java線程共享數據?

[英]Stop java threads from sharing data?

我有一個坐在端口上的應用程序(服務器端),用於偵聽客戶端連接。 建立連接后,應用程序將啟動解析器(另一個線程)來處理該連接。

我的問題是,在某些時候(因為解析可能需要很長時間),服務器應用程序啟動了一個新線程,而其他線程正在處理中。 這是期望的行為,本身不是問題。 發生的情況是,新線程似乎從舊線程讀取了一些狀態變量,因此操作錯誤。

松散地,解析器的作用是:客戶端始終發送兩個數據包; 第一個基本上是敲敲敲敲包,第二個是實際數據包。 我讀了第一個數據包,如果我決定接受它,則將其放入變量中,以便可以讀取下一個數據包。

在描述的場景中,第一個線程讀取爆震數據包並對其進行驗證。 下一個數據包到達(在同一線程上)並開始解析。

同時,另一個解析器被創建,它等待第一個數據包。 然后發生的問題(問題)是,它檢查驗證變量(對於該線程應該為false),並且發現它沒問題(它從仍在執行的前一個線程中讀取)並繼續解析敲除敲除數據包,就好像它是數據包一樣。

尋找的是一種完全消除數據共享的方法。 我正在使用以下類來跟蹤會話狀態:

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

除此之外,該類還有很多設置方法和獲取方法。

解析器將此對象的實例作為私有字段。

我將如何實現呢?

您需要確保兩個單獨的線程使用兩個單獨的SessionInfo實例。

最簡單的方法可能是創建一個新的解析器實例,該實例又創建一個新的SessionInfo實例。 一旦確定它們具有單獨的實例,就可以了。

解析器將此對象的實例作為私有字段。

這是你的問題。 一種解決方案是創建一個新的SessionInfo並將其作為方法參數傳遞給解析器,然后將其傳遞給其他方法調用。 完成此操作后,對會話狀態的引用將位於當前線程執行的本地。

如果您的解析器包含更多在解析過程中更新的私有屬性,則還需要提取這些私有屬性。 將它們組合到私有子類中並在調用您進行解析時創建該類的實例可能是該問題的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM