首页 新闻 会员 周边

一个简单的java多线程问题

0
悬赏园豆:20 [已解决问题] 解决于 2014-02-26 10:37
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应该加在什么位置?可否详细讲下

程序猿_哲的主页 程序猿_哲 | 初学一级 | 园豆:186
提问于:2014-02-19 16:40
< >
分享
最佳答案
0

加到哪儿都不对,因为你的 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;

}

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2014-02-19 16:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册