您好我还是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);
}
}
答案 0 :(得分:1)
您至少执行了两个单独的线程。有一个“主”线程,它是执行main方法的线程,第二个线程执行run()
类的Sorter
方法。这两个并行执行。在单核系统上,JVM将在它们之间来回切换,但在多核系统上,它们可能都会在自己的核心上执行。
当您调用Arrays.sort()
时,库例程将执行排序并在每次需要确定输出中的两个compare
值中的哪一个出现时调用Double
方法。 run
成员的值用于在主要(在本例中为事件调度)线程更改其值时暂停和恢复排序过程,因此某种类型的UI可以监视其进度。排序
所以,总结一下:
run
的值以控制排序线程的行为。run
的值。如果是true
,则等待100毫秒,然后进行比较。这可能会减慢排序的进度,以便可视化。如果它是假的,它等待获取与UI的某种形式的互锁,因此UI可以显示排序的位置。排序的循环超出了库的sort
方法中的方法。在run
方法中,您创建了Comparator<Double>
的实例,然后在Arrays.sort()
的主题上调用Runnable
。 Arrays.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)
if
,else if
和else
语句总是检查真相。因此if(run)
与if(run==true)
或&#34相同;如果运行为真,那么......&#34;