2012-06-25 47 views
4

Java(Android)中是否可以實現帶有自己狀態的Thread的自定義版本?帶自定義狀態的線程

我的意思是: 雖然ThreadA中處於行駛狀態時,它仍然可以通過ThreadB輪詢,詢問其狀態

e.g. 
ThreadA.getState(); 

它是可以修改的狀態值,一些自定義的?爲了在這兩個線程之間實現一種基本的通信系統?

謝謝。

+1

只需子類'線程'並在其中提供您自己的狀態。 – user1329572

回答

5

是的,這是可能的。我在以前的項目中使用過很多,所有你需要的是擴展Thread類。

public class StateThread extends Thread{ 
    String state = "ThreadState"; 
    public synchronized void setState(String newState){ 
     state = newState; 
    } 
    public synchronized String getState(){ 
     return state; 
    } 
    @override 
    public void run(){ 
     // Do stuff and update state... 
    } 
} 
+0

謝謝,Java確實是非常強大的 – 2dvisio

1

線程狀態是由虛擬機維持。 VM使用狀態來監視和管理實際的線程。

這就是爲什麼沒有機制來修改Thread的狀態。沒有setState函數允許設置您的自定義狀態。

爲了您的應用目的,您可以通過擴展Thread來定義自己的實例變量,但不能以任何方式改變Thread的狀態。

2

是的,可以執行此任務。
這是一個很好的設計嗎?我不這麼認爲。
還有其他方法可以執行線程之間的通信 -
例如,您應該使用生產者/消費者模式的隊列。
我相信Android,作爲JavaSE支持線程本地 - 您可以使用它來管理本地線程數據(包括狀態)(也許結合一個隊列來獲取「操作」來更改由線程管理的狀態
如果你決定去具有的setState和的getState方法的解決方案,至少可以考慮使用ReaderWriterLock來優化您的鎖定

+0

+ +1提出了一些可能值得一提的麻煩。直接檢查共享的「狀態」對象並不有效,因爲檢查的線程無需執行任何操作。我在嵌入式作業中使用了這種方法 - 狀態對象在其「正常」輸入隊列或其他任何線程上傳遞,並且必須在10秒內返回到低優先級的「LED閃爍」線程。如果物體沒有回來,LED停止閃爍,硬件看門狗定時器不刷新。這可以檢測卡住或循環的線程(只有一個內核,所以其他地方的循環會停止閃爍線程的運行)。 –

1

與共享的數據同步,則用於確定線程的「國家」是非常有用的 - 線程將其狀態寫入「健康」,然後卡住 - 監視線程然後檢查狀態並發現它健康。

監視'狀態'應該意味着讓被檢查的線程執行某些操作,而不是直接查看某個共享對象。

如果你有一個消息傳遞設計(如zaske所建議的),你可以在evey線程的輸入隊列上傳遞一個'狀態記錄',要求它記錄它的狀態並將它傳遞給下一個線程。 '監視'線程等待記錄返回,全部填入。如果它沒有在合理的時間內得到它,它可以記錄它的內容 - 它保持對狀態記錄對象的引用,所以它可以看到哪個線程沒有更新它的狀態。它也許可能無法送入看門狗定時器。