我现在正在尝试将更新检查模块添加到我的程序中。该方法正在处理网站以获得更新信息。但在某些情况下,网站无法访问,程序会在0.5秒内停止检查。为了实现这一点,我写了这些代码:
int[] lock = new int[0];
boolean fileListGot = false;
Thread downloadFile = new Thread() {
public void run() {
synchronized (lock) {
fileList = HttpFetcher.fetch("http://*****/****");
fileListGot = true;
lock.notify();
}
}
};
synchronized (lock) {
downloadFile.start();
lock.wait(500);
}
return fileListGot;
但该计划在0.5秒后没有停止。该计划有什么问题?以及如何使用Object.wait(long)?
答案 0 :(得分:1)
阅读Object.notify javadocs - 重要的部分是“唤醒的线程将无法继续,直到当前线程放弃对此对象的锁定。”
主线程获取lock
的监视器。它启动工作线程。工作线程试图获得lock
的监视器,但不能。主线程然后调用lock.wait(500)
,因此丢失了监视器。工作线程然后获得监视器并继续。如果下载仍然在500ms后继续,则等待返回并且主线程尝试获取监视器,但它仍然拥有工作线程。
下载文件时不需要按住显示器,只有在改变共享变量时才这样做 - 试试这个
public void run() {
T temp = HttpFetcher.fetch("http://*****/****");
synchronized (lock) {
fileList = temp;
fileListGot = true;
lock.notify();
}
}
其中T是fileList的适当类型
答案 1 :(得分:0)
您输入synchronized块然后启动一个线程。线程的运行尝试进入synchronized块并永远等待,因为你已经从另一个线程获取了相同的锁。
将downloadFile.start()
移离同步块。