【发布时间】:2014-08-30 17:43:55
【问题描述】:
所以我需要创建一个线程数组列表,但根据
Java - Filling an ArrayList of Threads with loop
看来我需要使用 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 个线程返回之前,for 循环是否停止,然后继续等待第 i+1 个线程?
【问题讨论】:
-
您的问题的格式和表述都非常好。我认为这是你的第一个问题。请记住,语言标签可能是最重要的标签,以便遵循他们精通的语言标签的用户可以看到您的问题得到强调。
-
如果两个或多个线程可以同时访问和修改同一个对象,您需要某种同步。在您的情况下,只有主线程知道
t,从任何创建的Communicate对象中都看不到它。你可能需要同步那些BTConnections,因为那些可以被主线程和创建的线程访问,但你必须做一些非常奇怪的事情(为什么要在多个线程中使用一个连接?)这实际上成为一个问题。 -
@MattiasBuelens 好吧,连接应该在循环的每次迭代中不断变化......我错了吗?
-
这里不需要同步。如果您只想等待所有线程完成,请考虑使用 java.util.concurrent.CountDownLatch。您需要修改 Communicate 中的线程代码以在返回之前调用 latch.countDown()。
-
@user217354 是的,您当前的代码没有问题。我只是说,如果您以后要对这些连接执行其他操作(例如生成新线程对它们执行其他操作),您可能需要同步...呃,已经忘记它了:您的代码很好。 :-P
标签: java multithreading arraylist synchronized