Java 循环不';t执行内部if语句

Java 循环不';t执行内部if语句,java,if-statement,while-loop,Java,If Statement,While Loop,我在一个线程中使用了以下方法,它可以100%工作,但一旦我删除System.out.println(“此处”)代码停止执行它正在执行的操作。没有错误,只是看起来什么都没做。这样做的目的是使图像的颜色变亮,其中的调试行变亮,没有调试行,图像就不会变亮。为什么会这样 线程类: package pocketshop.threads; import com.jogamp.opencl.CLBuffer; import java.awt.Container; import java.awt.image.

我在一个线程中使用了以下方法,它可以100%工作,但一旦我删除
System.out.println(“此处”)代码停止执行它正在执行的操作。没有错误,只是看起来什么都没做。这样做的目的是使图像的颜色变亮,其中的调试行变亮,没有调试行,图像就不会变亮。为什么会这样

线程类:

package pocketshop.threads;

import com.jogamp.opencl.CLBuffer;
import java.awt.Container;
import java.awt.image.BufferedImage;
import java.nio.FloatBuffer;
import pocketshop.Canvas;
import pocketshop.graphics.CL;
import pocketshop.graphics.Preview;

/**
 *
 * @author Ryan
 */
public class AdjustThread extends Thread {

    protected float amount = 0;
    protected CLBuffer<FloatBuffer> buffer;
    protected String adjustment;
    protected Container parent;

    public AdjustThread(Container parent, String adjustment) {
        this.parent = parent;
        this.adjustment = adjustment;
    }
    public void setAmount(float amount){
        this.amount = amount;
    }

    public CLBuffer<FloatBuffer> getBuffer() {
        return buffer;
    }

    public void run() {
        float cAmount = 0;
        while(true){
            System.out.println("here");
            if(cAmount != this.amount){
                cAmount = this.amount;
                CL.start(adjustment, this.amount);
                buffer = CL.getBuffer();

                float[] pixels = CL.getPixels();
                BufferedImage newimage = new BufferedImage(Canvas.image.getWidth(), Canvas.image.getHeight(), BufferedImage.TYPE_INT_RGB);
                buffer.getBuffer().get(pixels).rewind();
                newimage.getRaster().setPixels(0, 0, Canvas.image.getWidth(), Canvas.image.getHeight(), pixels);
                Preview.setImage(newimage);
                Canvas.preview = Preview.getImage();
                parent.repaint();
            }
        }
    }
}

此金额是否声明为
易失性

我认为这个字段是由于在另一个线程中赋值而改变的。如果未声明为
volatile
,则没有理由假定运行上述
run()
方法的线程将观察到它的更改。在第一次将
此.amount
分配给
cAmount
之后,无论如何,从该线程的角度来看,它们在此后保持相等

一旦您为我们澄清了
this.amount
上声明的限定符,并显示了在其他地方更改的代码片段,我们可以帮助指定恢复所需行为所需的适当同步设备


至于为什么调用
PrintStream#println()
似乎会在这里产生影响,它可能不仅会导致延迟,而且可能还会触及内存可见性边缘,该边缘允许
this.amount
的更改对此线程可见。这是一个很大的问题,但我认为在确定这种副作用的根本原因之前,首先要解决更大的问题。

千万不要用这种方式比较浮动!看,这里似乎没有什么问题。你确定
System.out.println
行是唯一改变的东西吗?是的,我用它运行了,没有注释,它工作了。停止它,然后将其注释掉,然后再次运行,但它不起作用。我发现联合国对它进行了评论,它成功了。我将
System.out.println
替换为
sleep(1),这就解决了问题,但我的编辑说这样做不是个好主意。不是吗?看:
package pocketshop.dialogs;

import java.awt.image.BufferedImage;
import pocketshop.Canvas;
import pocketshop.graphics.adjustments.Contrast;
import pocketshop.threads.AdjustThread;

/**
 *
 * @author Ryan
 */
public class BrightnessContrastDialog extends javax.swing.JDialog {

    AdjustThread adj;

    /**
     * Creates new form BrightnessContrastDialog
     */
    public BrightnessContrastDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        adj = new AdjustThread(this.getParent(), "Brightness");
        adj.start();
    }

    // Run everytime the JSlider moves
    private void sldBrightnessStateChanged(javax.swing.event.ChangeEvent evt) {                                           
        float val = sldBrightness.getValue();
        txtBrightness.setText("" + (int) val);
        adj.setAmount(val);
    }
}