除非在while循环中插入简单的print语句,否则代码不起作用

时间:2014-03-06 10:31:06

标签: java

我有以下代码

public String ls() throws IOException, InterruptedException {
    String pwd = getPWD();
    String inodePath = "Upload/Files" + pwd + "inode";

    // Request the inode file first
    Peer.setFileReceivedCheck(false);
    Inode i = new Inode();
    i.requestInode(pwd + "inode");

    boolean fileCheck = Peer.getFileReceivedCheck();
    System.out.println(fileCheck);
    while (fileCheck == false) {
        System.out.println(); // DOES NOT WORK IF THIS LINE IS REMOVED!!
        fileCheck = Peer.getFileReceivedCheck();
    }
    System.out.println(fileCheck);

    return i.readFromInode(inodePath);
}

在上面的java方法中,fileCheck变量跟踪文件从网络下载的时间,并在文件下载完成时变为true;这样当文件下载完成时函数就会返回。

我面临的一个奇怪的问题是,如果我删除上面的行(只有一个println);该方法卡在while循环中,即使文件已下载,也不会返回!知道为什么会这样吗?

编辑:这不是在单独的线程中运行。另一个类(Peer.java)中的文件下载代码单独运行。同样,fileCheck的getter不在线程中。

2 个答案:

答案 0 :(得分:3)

请以$ DEITY的名义,不要使用热门轮询。停止。马上。您正在浪费数十亿次循环,当您等待某些东西通过网络时,您将使整个系统的响应速度降低。使用回调 - 我们在2014年,这不是火箭科学。

那就是说,用这个来重新说明while循环的内容:

Object o = new Object();
synchronized(o) {
   fileCheck = Peer.getFileReceivedCheck();
}

发生的情况是你的检查可能只返回一个非易失性字段,编译器可以自由地优化它 - 除非你的代码遇到同步点。

答案 1 :(得分:0)

您是否尝试添加一个小超时(100毫秒),而不是println()