整数在内循环中不递增

时间:2015-01-09 21:04:47

标签: java multithreading increment

快速说明: 在多线程循环中,整数不会在内循环中递增,而在外循环中则是递增。

我的代码:

public void run() {
        if(maxH==actualmaxH)
            actualmaxH--;
        if(maxW==actualmaxW)
            actualmaxW--;
        for(;i<=actualmaxW; i++) {
            for (; j <=actualmaxH; j++) {
                Hit hit=world.hit(cam.rayFor(maxW,maxH,i,j));
                Color col;

                if(hit==null)
                    col = world.backgroundColor;
                else
                    col = hit.geo.material.colorFor(hit, world, 0);

                int rgb = ((int)(col.r*255)<< 16) | ((int)(col.g*255)<< 8) | ((int)(col.b*255));
                raster.setDataElements(i, maxH - j - 1, model.getDataElements(rgb, null));
            }

            if(i%30==0) {
                frame.update(g);
            }
        }
        frame.update(g);
    }

这段代码是从构造函数通过“new Thread(this)”调用的(这实现了Runnable),并且构造函数是从具有不同i,j和实际的另一个类调用的。 其余基本保持不变

同样,问题是在外部循环中i增加得很好,而在内部循环中它总是0(或者当然是其他线程中的其他起始数字)

我希望我足够清楚。 如果有什么不清楚的话,我会高兴地回答我的代码中的问题,并希望任何人都能找到解决方案。 无论如何,谢谢=)

编辑: 从哪里开始:

Thread t1=new Thread(0,0, img.getWidth()/2, img.getHeight()/2, img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g);
            Thread t2=new Thread(img.getWidth()/2+1, 0, img.getWidth(), img.getHeight()/2, img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g);
            Thread t3=new Thread(0, img.getHeight()/2+1, img.getWidth()/2, img.getHeight(), img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g);
            Thread t4=new Thread(img.getWidth()/2+1, img.getHeight()/2+1, img.getWidth(), img.getHeight(), img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g);

和要匹配的构造函数:

java.lang.Thread t;
    int i;
    int j;
    int maxW;
    int maxH;
    int actualmaxW;
    int actualmaxH;
    World world;
    Camera cam;
    WritableRaster raster;
    ColorModel model;
    JFrame frame;
    Graphics g;

    public Thread(int i, int j, int actualmaxW, int actualmaxH, int maxW, int maxH, World world, Camera cam, WritableRaster raster, ColorModel model, JFrame frame, Graphics g){
        this.i=i;
        this.j=j;
        this.actualmaxW=actualmaxW;
        this.actualmaxH=actualmaxH;
        this.maxW=maxW;
        this.maxH=maxH;
        this.world=world;
        this.cam=cam;
        this.raster=raster;
        this.model=model;
        this.frame=frame;
        this.g=g;
        t=new java.lang.Thread(this);
        t.start();
    }

1 个答案:

答案 0 :(得分:1)

这似乎是问题所在:

for(;i<=actualmaxW; i++) {
    for (; j <=actualmaxH; j++) {

如果j在外循环的第一次迭代中变得大于actualmaxH,会发生什么?内循环将退出。所以,现在出现了外部循环的第二次迭代,其中i现在增加了1。但由于j仍然大于actualmaxH,内循环将不再“使用”。

可能的解决办法是:

for (; i <= actualmaxW; i++) {
    for (int temp = j; temp <= actualmaxH; temp++) {

然后在内部循环中使用temp而不是j