我有以下代码
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不在线程中。
答案 0 :(得分:3)
请以$ DEITY的名义,不要使用热门轮询。停止。马上。您正在浪费数十亿次循环,当您等待某些东西通过网络时,您将使整个系统的响应速度降低。使用回调 - 我们在2014年,这不是火箭科学。
那就是说,用这个来重新说明while循环的内容:
Object o = new Object();
synchronized(o) {
fileCheck = Peer.getFileReceivedCheck();
}
发生的情况是你的检查可能只返回一个非易失性字段,编译器可以自由地优化它 - 除非你的代码遇到同步点。
答案 1 :(得分:0)
您是否尝试添加一个小超时(100毫秒),而不是println()
?