public class Begin { public static void main(String[] args) { Image image = new Image(); List<String> list = new ArrayList<String>(); list.add("1.jpg"); list.add("5.jpg"); list.add("2.jpg"); list.add("7.jpg"); list.add("6.jpg"); list.add("9.jpg"); image.setUrls(list); for (int i = 0; i < 3; i++) { ImageDFile imageDFile = new ImageDFile(image); imageDFile.start(); } } }
ImageDFile类
public class ImageDFile extends Thread { public Image image; public ImageDFile(Image image) { this.image = image; } @Override public void run() { List<String> list = image.getUrls(); for (int i = 0; i < list.size(); i++) { if (list.size() > 0) { System.out.println(list.get(i) + "---" + Thread.currentThread().getName()); list.remove(i); } } } }
Image类就一个属性 private List<String> urls
运行的时候时不时的报错
Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
知道肯定是多线程导致的,不知道synchronized应该加在什么位置?可否详细讲下
加到哪儿都不对,因为你的 Image.getUrls 返回的是整个 List<String>,这样你就会有多个线程使用 for 循环在同一个 List<String> 上读取和删除。
你的 Image 类应该实现下述方法:
public synchronized String getNextUrl()
{
int count = list.size();
if(count > 0)
{
String url = list[0];
list.remove(0);
return url;
}
return null;
}