TL; DR版本:我有兩個線程。其中一個可能需要Interrupt()另一個,但只有當另一個線程處於處理與受第一個線程影響的對象相關的數據的中間時。我怎樣才能根據某些條件中斷()第二個線程。如何同步這些線程以避免數據損壞?
我一直在研究一個程序,該程序可以處理套接字數據並更新GUI的信息。兩個線程(topologyThread和dataThread)處理我的應用程序的兩個不同方面,即我們無線傳感器網絡的拓撲變化通知,以及用於接收和處理來自無線傳感器網絡的數據的數據信息。
當數據進入dataThread時,數據包所代表的網絡成員可能已經被topologyThread移除了,因此不應該被處理。所以,我一直在想,使用Thread.Interrupt()方法可以讓我立即通知dataThread拓撲結構的變化,並且防止我們在嘗試用一個網絡成員的數據更新GUI時遇到的一些問題不再連接。我的問題是:如何判斷dataThread是否需要中斷?我不希望它在處理仍然連接的網絡成員的數據時拋出異常,但是如果它處於處理斷開連接的網絡成員的數據的過程中,我希望它被中斷。
方案1:
- 數據來自在dataThread。
- dataThread確保網絡成員仍然是網絡的一部分。
- dataThread處理數據到端部和更新GUI
方案2:
- 數據來自在上dataThread。
- dataThread確保網絡成員仍然是網絡的一部分。
- 網絡成員已斷開連接,因此不進行處理。
方案3:
- 數據來自在dataThread。
- dataThread確保網絡成員仍然是網絡的一部分。
- dataThread開始處理數據
- topologyThread接收到網絡成員已斷開連接並將其從拓撲中刪除的通知。
- dataThread嘗試更新不再連接的網絡成員的GUI。
這是我試圖編寫的場景3。在我們的測試中,這種情況是側欄中的樹視圖凍結並且應用程序必須被終止的地方。但是,如果受到topologyThread影響的對象是dataThread當前正在處理的對象,那麼我只需要中斷dataThread。
感謝您的閱讀。 :)
我與此類似的解決方案。如果在拓撲線程嘗試刪除它時,dataThread正在處理特定的網絡成員,則拓撲線程將等待,直到該標記爲空,然後再從拓撲中刪除它。 – jxpx777 2009-02-20 15:43:02