2011-08-24 47 views
1

我想創建一個應該在其他會話中共享的工作線程。基本上我想限制其他用戶執行相同的過程。所以他們會通過我創建的對象線程的靜態實例來檢索線程。如果線程仍然存在,則會提示錯誤。線程對象可以設置爲靜態變量

有沒有其他的方式來做到這一點,因爲我想如果將一個線程對象放在一個靜態是安全的?我也在考慮應用程序上下文,但我不確定哪種方法可以在java中執行此操作?

回答

2

將任何對象放置在靜態或任何類型的共享位置中都不是本質上不安全的,但您需要注意設計。

聲明

static Thing t; 

初始化

if (t == null) { 
     t = new Thing(); 
    } 

使用

t.dosomething(); 

現在會發生什麼,如果兩個線程在同一時間擊中INITIALISE塊?你可以得到兩件創造的東西。可能不希望這樣,所以使用同步。

synchronized void intialise() { 
    if (t == null) { 
     t = new Thing(); 
    } 

} 

如果兩個線程同時嘗試使用t,會發生什麼情況。這取決於Thing所做的承諾。如果是線程安全沒有問題,否則你的代碼需要提供同步

synchronized void doSomthing() { 
     t.doSomething(); 
    } 
+0

Can Thing be =線程對象? – Nap

+1

事情可能是任何事情,沒有什麼特別的線程對象。 – djna

1

我會爲您設置的靜態字段使用鎖,以避免兩個任務啓動進程的可能性。您可以存儲線程,以便知道何時完成,或者AtomicBoolean在運行時標記。 (您也可以鎖定)

+0

因此,將線程存儲爲靜態是否安全?我的意思是,如果我存儲會話,則其他會話無法訪問。 – Nap

+1

其安全提供線程安全。然而,這不是正常的做法,值得評論爲什麼這樣做。 –

1

你可以有一個原子布爾來標記你的工作線程的狀態,只有當它返回false線程。

當工作線程啓動時,您需要將其設置爲true。

+0

我知道,但原子布爾可能不會給我線程的實時狀態。如果它只是狀態是好的,但我想檢索線程內的一些信息,如狀態消息列表。或者我應該也將狀態消息作爲一個靜態列表? – Nap

+1

如果我需要任何其他信息,那麼將所有這些信息保存在一些包裝中,並在每次訪問時使用鎖來保護包裝對象(對於讀/寫)。這很重要,因爲您不應該允許直接引用共享對象。所有訪問都應該同步。 – Nrj