2012-11-07 37 views
0

當start_activity線程(主線程)在信號睡眠時訪問packetList對於來自start_thread的線程是安全的。如果沒有,那麼我怎樣才能共享他們之間的資源,請注意訪問只會被讀取,packetList不會被改變。訪問睡眠線程資源

  class A{ 
       Vector<packet> packetList; 
       A() 
       { 
        //packetList initialized here 
       } 

       void start_thread() 
       { 
       //start a thread here 
       } 
       void start_activity() 
       { 
        while(true) 
        { 
         //possibly sleep on semephore 
         //do work 
        } 
       } 
      } 
+0

這是可能的,但是你必須同步訪問列表。當線程正在喚醒時,您必須考慮有人讀取矢量的情況。 –

+0

@JakubZaverka當主線程在信號量上睡眠時,其他線程是否可以訪問數組? –

回答

0

您可以訪問Vector,前提是您不必遍歷它。如果您迭代它,則需要在該對象上使用​​進行鎖定。

如果你想排隊工作的「數據包」,我建議你看看使用BlockingQueue,你可以等待添加新任務,或者使用一個將Queue和ThreadPool結合起來的ExecutorService。

0

如果我理解正確,你的問題是「我正在使用信號量來同步線程訪問共享數據結構」 - 在這種情況下,答案是「肯定是」,只要你訪問Vector的方法是嚴格按照規定,即:

while(true) 
    { 
     //acquire lock 
     //do work 
     //release lock 
    } 

,你必須在主線程上的匹配結構(即你在做任何工作之前獲得鎖) - 這將確保線程到Vector訪問正確同步

+0

基本上,我希望能夠從兩個線程訪問數組,無論哪個人在睡覺,我怎麼能這樣做? –

+0

http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html – thedayofcondor