布尔问题

时间:2014-08-08 17:01:15

标签: java thread-safety boolean

您好我还是Java新手,我有一个问题 在下面的代码中,何时执行run语句的“if part”中的代码。 似乎布尔字段被赋值为false但是如果我调用setRun(),则run等于true但是语句if(run)是混乱的,它是在run为true或false时执行的。 它看似简单,但我无法理解它

class Sorter implements Runnable {
    /**
     * Constructs a Sorter.
     * 
     * @param values
     *            the array to be sorted
     * @param comp
     *            the component on which to display the sorting progress
     */
    private Double[] values;
    private ArrayComponent component;// This class draws and array and marks two values in the array
    private Semaphore gate;
    private static final int DELAY = 100;
    private volatile boolean run;
    private static final int VALUES_LENGTH = 30;

    public Sorter(ArrayComponent comp) {
        values = new Double[VALUES_LENGTH];
        for (int i = 0; i < values.length; i++)
            values[i] = new Double(Math.random());
        this.component = comp;
        this.gate = new Semaphore(1);
        this.run = false;
    }

    /**
     * Sets the sorter to "run" mode. Called on the event dispatch thread.
     */
    public void setRun() {
        run = true;
        gate.release();
    }

    /**
     * Sets the sorter to "step" mode. Called on the event dispatch thread.
     */
    public void setStep() {
        run = false;
        gate.release();
    }

    public void run() {
        Comparator<Double> comp = new Comparator<Double>() {
            public int compare(Double i1, Double i2) {
                component.setValues(values, i1, i2);
                try {
                    if (run) Thread.sleep(DELAY);
                    else gate.acquire();
                } catch (InterruptedException exception) {
                    Thread.currentThread().interrupt();
                }
                return i1.compareTo(i2);
            }
        };
        Arrays.sort(values, comp);
        component.setValues(values, null, null);
    }

}

4 个答案:

答案 0 :(得分:1)

您至少执行了两个单独的线程。有一个“主”线程,它是执行main方法的线程,第二个线程执行run()类的Sorter方法。这两个并行执行。在单核系统上,JVM将在它们之间来回切换,但在多核系统上,它们可能都会在自己的核心上执行。

当您调用Arrays.sort()时,库例程将执行排序并在每次需要确定输出中的两个compare值中的哪一个出现时调用Double方法。 run成员的值用于在主要(在本例中为事件调度)线程更改其值时暂停和恢复排序过程,因此某种类型的UI可以监视其进度。排序

所以,总结一下:

  • 主线程正在更新某种类型的UI,并且正在运行排序线程的 。它会更改run的值以控制排序线程的行为。
  • 排序主题查看run的值。如果是true,则等待100毫秒,然后进行比较。这可能会减慢排序的进度,以便可视化。如果它是假的,它等待获取与UI的某种形式的互锁,因此UI可以显示排序的位置。

排序的循环超出了库的sort方法中的方法。在run方法中,您创建了Comparator<Double>的实例,然后在Arrays.sort()的主题上调用RunnableArrays.sort()为每次比较调用比较器的compare()方法(仍然在runnable的线程上)。

在每次比较中,如果run为真,则代码延迟100毫秒,然后返回比较结果。否则它会调用gate.acquire(),当它返回时,它会继续返回比较结果。在这两种情况下,它都返回比较结果,唯一的区别是与其他线程同步(无论gate.acquire()做什么)。

答案 1 :(得分:0)

if(run)

将在run为true时执行。

为自己测试的一种简单方法是在If语句中输出run的值:

System.out.println("If statement ran because run is: "+run);

答案 2 :(得分:0)

Java基元boolean在创建时自动设置为false。您的代码从不调用方法setRun(),因此在代码的整个生命周期中,变量&#34;运行&#34;是假的。因此,你的if语句

if(run)

总是评估为不是真的,并且总是会跳到其他地方。如果你想&#34;运行&#34;要么是真的,要么将它初始设置为true,而使用

声明它
private volatile boolean run = true;

或在某个时候调用setRun()。

答案 3 :(得分:-1)

ifelse ifelse语句总是检查真相。因此if(run)if(run==true)或&#34相同;如果运行为真,那么......&#34;