2014-08-30 85 views
1

所以我需要創建線程的ArrayList但根據爲什麼我必須同步線程的ArrayList?

Java - Filling an ArrayList of Threads with loop

看來,我需要使用synchronized關鍵字,那麼我的問題是:

,如果im調用這個只在主線程爲什麼我必須使用synchronized關鍵字?有沒有其他線程可能會做同樣的權利?

ArrayList<Thread> t = new ArrayList<Thread>(); 
for(int i=0;i<love.size();i++){ 
    BTConnection cbtc = love.get(i).btc; 
    if(cbtc!=null){ 
     Communicate temp = new Communicate(cbtc); 
     Thread ttemp = new Thread(temp); 
     ttemp.start(); 
     t.add(ttemp); 
    } 
} 

而且如果正確我用下面的代碼:

for(int i=0;i<t.size();i++){ 
    t.get(i).join(); 
} 

是否爲循環停止,直到第i個線程返回,然後繼續等待第i + 1?

+0

你的問題格式化和制定得很好。因爲我看到這是你的第一個問題的榮譽。請記住,語言標籤可能是最重要的語言標籤,因此,遵循他們熟練使用的語言標籤的用戶可以看到您強調的問題。 – bolov 2014-08-30 17:54:04

+0

如果兩個或多個線程可能同時訪問和修改同一個對象,則需要某種同步。在你的情況下,只有主線程知道't',它從任何創建的'Communicate'對象都是不可見的。你可能需要在這些'BTConnection'上同步,因爲這些*可以被主線程和創建的線程訪問,但是你必須做一些非常奇怪的事情(爲什麼你要在多線程中使用一個連接?)實際上成爲一個問題。 – 2014-08-30 18:11:04

+0

@MattiasBuelens那麼,在循環的每次迭代中,連接都應該不斷變化......我錯了嗎? – user217354 2014-08-30 20:45:35

回答

1

我看不出有什麼理由需要同步線程表,如果只有一個線程正在爲其添加值或從中讀取值。至於第二部分,你是正確的,join-呼叫將阻止,直到ithth線程完成,然後再等待下一個線程。

相關問題