有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    一个好的优化器可能会发现hang()什么都不做——它没有副作用(除了花费时间之外),也不会产生任何输出。因此,它优化为“无”

    我怀疑这就是正在发生的事情

    您看到两个“完整”执行的原因是,即时编译器没有立即在该例程上释放