java为什么hang()方法只执行一次?
class Demo{
static void hang(){ // Freezes/Hangs the program for some seconds.
for(int i=0 ; i<100000 ; i++){
for(int j=0 ; j<10000 ; j++){
for(int k=0 ; k<10000 ; k++){
int b = 5%12000;
}
}
}
}
public static void main(String a[]){
System.out.print("Loading");
hang();
for(int it=0 ; it<5 ; it++)
{
System.out.print(".");
hang();
}
}
}
hang()
方法的任务是挂起/冻结程序一段时间(我知道有其他方法可以冻结程序,但我想用for循环来显示它)。
但是当我执行这个时,System.out.print("Loading")
下面的第一个hang()
调用占用了一定的时间并给出了延迟,for循环中的第一个调用也给出了延迟,但是其余的调用(在for循环中)没有占用任何时间并立即执行,并且没有看到延迟
考虑所有^ {< CD1>}调用正在被调用(我通过在{{CD1>}方法中编写一个打印语句来检查)。
考虑^ {< CD6>}每次调用时都需要时间(甚至通过替换{{< CD7>})检查
此代码在C++中工作,即在每个“之后”显示延迟。p>
<> C++中的输出是类似的
Loading[d].[d].[d].[d].[d].
但在Java中,它就像
Loading[d].[d]....
[d]
是延迟
如果我用hang()
方法中的整个方法代码替换hang()
调用,它就会工作
class Demo{
static void hang(){ // Freezes/Hangs the program for some seconds.
for(int i=0 ; i<100000 ; i++){
for(int j=0 ; j<10000 ; j++){
for(int k=0 ; k<10000 ; k++){
int b = 5%12000;
}
}
}
public static void main(String a[]){
System.out.print("Loading");
hang();
for(int it=0 ; it<5 ; it++)
{
System.out.print(".");
for(int i=0 ; i<100000 ; i++){
for(int j=0 ; j<10000 ; j++){
for(int k=0 ; k<10000 ; k++){
int b = 5%12000;
}
}
}
}
}
}
# 1 楼答案
一个好的优化器可能会发现
hang()
什么都不做——它没有副作用(除了花费时间之外),也不会产生任何输出。因此,它优化为“无”我怀疑这就是正在发生的事情
您看到两个“完整”执行的原因是,即时编译器没有立即在该例程上释放