2014-08-30 86 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线程完成,然后再等待下一个线程。

相关问题