如何将for循环的索引变量传递给匿名的Thread / Runnable

时间:2016-02-12 15:22:18

标签: java multithreading file for-loop io

我搜索过类似的问题,但他们没有涉及for循环。 我有以下代码:

    image = new BufferedImage[maxFiles];
    for (int i = 0; i < maxFiles; i++) {
        new Thread(){
            public void run() {                 
                try {
                    file = new File("0" + i + ".jpg");
                    image[i] = ImageIO.read(file);
                } catch (IOException e) {e.printStackTrace();}
            }
        };
    }

正如您所看到的,我希望通过自己的线程加载每个图像文件以优化一点。 不幸的是,for循环的变量 i 无法通过 run 方法传递,我无法将其设为final或static。你会如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

您可以拥有一个具有相同值的最终变量。

image = new BufferedImage[maxFiles];
for (int i = 0; i < maxFiles; i++) {
    final int index = i;
    new Thread(){
        public void run() {                 
            try {
                file = new File("0" + index + ".jpg");
                image[index] = ImageIO.read(file);
            } catch (IOException e) {e.printStackTrace();}
        }
    };
}

你可能也想开始你的主题。

答案 1 :(得分:0)

除了@ khelwood的解决方案,您还可以在匿名类中使用实例变量:

    for (int i = 0; i < maxFiles; i++) {
        new Thread() {
            // Capture i here.
            int index = i;

            public void run() {
                try {
                    file = new File("0" + index + ".jpg");
                    image[index] = ImageIO.read(file);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
    }